diff --git a/extensions-site/app/components/server-card.tsx b/extensions-site/app/components/server-card.tsx index 34990c9d2..877c2a140 100644 --- a/extensions-site/app/components/server-card.tsx +++ b/extensions-site/app/components/server-card.tsx @@ -6,35 +6,8 @@ import type { MCPServer } from "../types/server"; import { Link, NavLink } from "react-router"; import { useState } from "react"; import { motion, AnimatePresence } from "motion/react"; +import { getGooseInstallLink } from "../utils/install-links"; -function getGooseInstallLink(server: MCPServer): string { - if (server.is_builtin) { - const queryParams = [ - 'cmd=goosed', - 'arg=mcp', - `arg=${encodeURIComponent(server.id)}`, - `description=${encodeURIComponent(server.id)}` - ].join('&'); - return `goose://extension?${queryParams}`; - } - const parts = server.command.split(" "); - const baseCmd = parts[0]; // npx or uvx - const args = parts.slice(1); // remaining arguments - const queryParams = [ - `cmd=${encodeURIComponent(baseCmd)}`, - ...args.map((arg) => `arg=${encodeURIComponent(arg)}`), - `id=${encodeURIComponent(server.id)}`, - `name=${encodeURIComponent(server.name)}`, - `description=${encodeURIComponent(server.description)}`, - ...server.environmentVariables - .filter((env) => env.required) - .map( - (env) => `env=${encodeURIComponent(`${env.name}=${env.description}`)}` - ), - ].join("&"); - - return `goose://extension?${queryParams}`; -} export function ServerCard({ server }: { server: MCPServer }) { const [isCommandVisible, setIsCommandVisible] = useState(false); diff --git a/extensions-site/app/mcp-servers.ts b/extensions-site/app/mcp-servers.ts index f3b21e7e4..a290d869a 100644 --- a/extensions-site/app/mcp-servers.ts +++ b/extensions-site/app/mcp-servers.ts @@ -1,4 +1,4 @@ -import type { MCPServer } from '../types/server'; +import type { MCPServer } from '../app/types/server'; export async function fetchMCPServers(): Promise { try { diff --git a/extensions-site/app/routes/detail.tsx b/extensions-site/app/routes/detail.tsx index 8de8e6985..3bbcd5d6a 100644 --- a/extensions-site/app/routes/detail.tsx +++ b/extensions-site/app/routes/detail.tsx @@ -11,45 +11,13 @@ import { Badge } from "../components/ui/badge"; import { Card, CardContent, CardHeader } from "../components/ui/card"; import { useEffect, useState } from "react"; import { fetchMCPServers } from "../mcp-servers"; +import { getGooseInstallLink } from "../utils/install-links"; +import type { MCPServer } from "../types/server"; -interface Server { - id: string; - name: string; - description: string; - command: string; - link: string; - installation_notes: string; - is_builtin: boolean; - endorsed: boolean; - githubStars: number; - environmentVariables: { - name: string; - description: string; - required: boolean; - }[]; -} - -function getGooseInstallLink(server: Server): string { - const parts = server.command.split(" "); - const baseCmd = parts[0]; - const args = parts.slice(1); - const queryParams = [ - `cmd=${encodeURIComponent(baseCmd)}`, - ...args.map((arg) => `arg=${encodeURIComponent(arg)}`), - `description=${encodeURIComponent(server.description)}`, - ...server.environmentVariables - .filter((env) => env.required) - .map( - (env) => `env=${encodeURIComponent(`${env.name}=${env.description}`)}` - ), - ].join("&"); - - return `goose://extension?${queryParams}`; -} export default function DetailPage() { const { id } = useParams(); - const [server, setServer] = useState(null); + const [server, setServer] = useState(null); const [isCommandVisible, setIsCommandVisible] = useState(true); const [error, setError] = useState(null); const [isLoading, setIsLoading] = useState(true); @@ -213,25 +181,25 @@ export default function DetailPage() { {server.githubStars} on Github - - {server.is_builtin ? ( -
+ - - Built-in - -
- ) : ( + Built-in + + + ) : ( +
- )} - + + )} diff --git a/extensions-site/app/utils/install-links.tsx b/extensions-site/app/utils/install-links.tsx new file mode 100644 index 000000000..156fee79f --- /dev/null +++ b/extensions-site/app/utils/install-links.tsx @@ -0,0 +1,30 @@ +import type { MCPServer } from "../types/server"; + +export function getGooseInstallLink(server: MCPServer): string { + if (server.is_builtin) { + const queryParams = [ + 'cmd=goosed', + 'arg=mcp', + `arg=${encodeURIComponent(server.id)}`, + `description=${encodeURIComponent(server.id)}` + ].join('&'); + return `goose://extension?${queryParams}`; + } + const parts = server.command.split(" "); + const baseCmd = parts[0]; // npx or uvx + const args = parts.slice(1); // remaining arguments + const queryParams = [ + `cmd=${encodeURIComponent(baseCmd)}`, + ...args.map((arg) => `arg=${encodeURIComponent(arg)}`), + `id=${encodeURIComponent(server.id)}`, + `name=${encodeURIComponent(server.name)}`, + `description=${encodeURIComponent(server.description)}`, + ...server.environmentVariables + .filter((env) => env.required) + .map( + (env) => `env=${encodeURIComponent(`${env.name}=${env.description}`)}` + ), + ].join("&"); + + return `goose://extension?${queryParams}`; +} \ No newline at end of file diff --git a/extensions-site/public/servers.json b/extensions-site/public/servers.json index 1b9583605..72febce58 100644 --- a/extensions-site/public/servers.json +++ b/extensions-site/public/servers.json @@ -5,7 +5,7 @@ "description": "Built-in developer tools for file editing and shell command execution", "command": "", "link": "https://github.com/block/goose/tree/v1.0/crates/goose-mcp/src/developer", - "installation_notes": "This is a built-in extension that comes with Goose by default. No installation required.", + "installation_notes": "This is a built-in extension that comes with goose by default. No installation required.", "is_builtin": true, "endorsed": true, "githubStars": 356, @@ -13,51 +13,23 @@ }, { "id": "nondeveloper", - "name": "Non-developer", - "description": "Built-in tools for non-developer tasks and system interactions", + "name": "Computer Controller", + "description": "Built-in computer controlls for webscraping, file caching, and automations", "command": "", "link": "https://github.com/block/goose/tree/v1.0/crates/goose-mcp/src/nondeveloper", - "installation_notes": "This is a built-in extension that comes with Goose by default. No installation required.", + "installation_notes": "This is a built-in extension that comes with goose and can be enabled in the Settings page under 'Extensions'.", "is_builtin": true, "endorsed": true, "githubStars": 356, "environmentVariables": [] }, - { - "id": "google_drive", - "name": "Google Drive", - "description": "Built-in Google Drive integration for file management and access", - "command": "", - "link": "https://github.com/block/goose/tree/v1.0/crates/goose-mcp/src/google_drive", - "installation_notes": "This is a built-in extension that comes with Goose by default. Can be accessed via goose://extension?cmd=goosed&arg=mcp&arg=google_drive&description=google_drive deeplink.", - "is_builtin": true, - "endorsed": true, - "githubStars": 356, - "environmentVariables": [ - { - "name": "GOOGLE_DRIVE_OAUTH_PATH", - "description": "Path to the OAuth config file (required)", - "required": true - }, - { - "name": "GOOGLE_DRIVE_CREDENTIALS_PATH", - "description": "Path to store OAuth credentials (required)", - "required": true - }, - { - "name": "GOOGLE_DRIVE_OAUTH_CONFIG", - "description": "OAuth config JSON string (optional, if not provided expects valid config file at GOOGLE_DRIVE_OAUTH_PATH)", - "required": false - } - ] - }, { "id": "memory", "name": "Memory", "description": "Built-in memory system for persistent context and information storage", "command": "", "link": "https://github.com/block/goose/tree/v1.0/crates/goose-mcp/src/memory", - "installation_notes": "This is a built-in extension that comes with Goose by default. No installation required.", + "installation_notes": "This is a built-in extension that comes with goose and can be enabled in the Settings page under 'Extensions'.", "is_builtin": true, "endorsed": true, "githubStars": 356, @@ -69,7 +41,7 @@ "description": "Built-in JetBrains IDE integration for development workflows", "command": "", "link": "https://github.com/block/goose/tree/v1.0/crates/goose-mcp/src/jetbrains", - "installation_notes": "This is a built-in extension that comes with Goose by default. Can be accessed via goose://extension?cmd=goosed&arg=mcp&arg=jetbrains deeplink.", + "installation_notes": "This is a built-in extension that comes with goose and can be enabled in the Settings page under 'Extensions'.", "is_builtin": true, "endorsed": true, "githubStars": 356, @@ -103,7 +75,7 @@ "id": "git", "name": "Git", "description": "Git version control system integration", - "command": "npx -y @modelcontextprotocol/server-git", + "command": "uvx mcp-server-git", "link": "https://github.com/modelcontextprotocol/servers/tree/main/src/git", "installation_notes": "Install using npx package manager. Note: Does not support git push, merge or rebase operations.", "is_builtin": false,