diff --git a/documentation/docs/mcp/cloudinary-asset-management-mcp.md b/documentation/docs/mcp/cloudinary-asset-management-mcp.md index 36cf5347..f5d0f559 100644 --- a/documentation/docs/mcp/cloudinary-asset-management-mcp.md +++ b/documentation/docs/mcp/cloudinary-asset-management-mcp.md @@ -10,7 +10,7 @@ import YouTubeShortEmbed from '@site/src/components/YouTubeShortEmbed'; -This tutorial covers how to add the [Cloudinary Asset Management MCP Server](https://github.com/cloudinary-community/cloudinary-mcp) as a Goose extension to automate complex image processing workflows that would typically require specialized design software or manual editing. +This tutorial covers how to add the [Cloudinary Asset Management MCP Server](https://github.com/cloudinary/asset-management-js) as a Goose extension to automate complex image processing workflows that would typically require specialized design software or manual editing. :::tip TLDR diff --git a/documentation/src/components/prompt-card.tsx b/documentation/src/components/prompt-card.tsx index 458bae88..cec12f4c 100644 --- a/documentation/src/components/prompt-card.tsx +++ b/documentation/src/components/prompt-card.tsx @@ -19,7 +19,6 @@ function extensionToMCPServer(extension: Extension): MCPServer { installation_notes: extension.installation_notes || '', endorsed: false, environmentVariables: extension.environmentVariables || [], - githubStars: 0 }; } diff --git a/documentation/src/components/server-card.tsx b/documentation/src/components/server-card.tsx index b87022d4..684d71c0 100644 --- a/documentation/src/components/server-card.tsx +++ b/documentation/src/components/server-card.tsx @@ -1,14 +1,34 @@ import { Star, Download, Terminal, ChevronRight, Info } from "lucide-react"; -import { Badge } from "@site/src/components/ui/badge"; -import { Button } from "@site/src/components/ui/button"; import type { MCPServer } from "@site/src/types/server"; import Link from "@docusaurus/Link"; -import { useState } from "react"; +import { useState, useEffect } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { getGooseInstallLink } from "@site/src/utils/install-links"; +import { fetchGitHubStars, formatStarCount } from "@site/src/utils/github-stars"; + +const getExtensionCommand = (server: MCPServer): string => { + switch (server.type) { + case "remote": + return `goose session --with-remote-extension "${server.url}"`; + case "streamable-http": + return `goose session --with-streamable-http-extension "${server.url}"`; + case "local": + default: + return `goose session --with-extension "${server.command}"`; + } +}; export function ServerCard({ server }: { server: MCPServer }) { const [isCommandVisible, setIsCommandVisible] = useState(false); + const [githubStars, setGithubStars] = useState(null); + + useEffect(() => { + if (server.link) { + fetchGitHubStars(server.link).then(stars => { + setGithubStars(stars); + }); + } + }, [server.link]); return (
@@ -65,7 +85,7 @@ export function ServerCard({ server }: { server: MCPServer }) {
)} - {(!server.is_builtin && server.command !== undefined && server.url === undefined) && ( + {!server.is_builtin && ( <> - - {isCommandVisible && ( - - - {`goose session --with-remote-extension "${server.url}"`} - + {getExtensionCommand(server)} )} @@ -138,14 +121,14 @@ export function ServerCard({ server }: { server: MCPServer }) {
- {server.githubStars !== undefined && ( + {githubStars !== null && ( e.stopPropagation()} > - {server.githubStars} on Github + {formatStarCount(githubStars)} on Github )}
diff --git a/documentation/src/pages/extensions/detail.tsx b/documentation/src/pages/extensions/detail.tsx index b6d46ccd..3efef28d 100644 --- a/documentation/src/pages/extensions/detail.tsx +++ b/documentation/src/pages/extensions/detail.tsx @@ -1,5 +1,5 @@ import Layout from "@theme/Layout"; -import { Download, Terminal, Star, ArrowLeft, Info } from "lucide-react"; +import { Download, Terminal, Star, ArrowLeft, Info, BookOpen } from "lucide-react"; import { Button } from "@site/src/components/ui/button"; import { Badge } from "@site/src/components/ui/badge"; import { getGooseInstallLink } from "@site/src/utils/install-links"; @@ -7,9 +7,40 @@ import { useLocation } from "@docusaurus/router"; import { useEffect, useState } from "react"; import type { MCPServer } from "@site/src/types/server"; import { fetchMCPServers } from "@site/src/utils/mcp-servers"; -import Link from "@docusaurus/Link"; +import { fetchGitHubStars, formatStarCount } from "@site/src/utils/github-stars"; +import Link from "@docusaurus/Link"; function ExtensionDetail({ server }: { server: MCPServer }) { + const [githubStars, setGithubStars] = useState(null); + + +// outliers in naming +const overrides: Record = { + 'computercontroller': 'computer-controller-mcp', + 'pdf-read': 'pdf-mcp', + 'knowledge-graph-memory': 'knowledge-graph-mcp' +}; + +const getDocumentationPath = (serverId: string): string => { + let filename = serverId.replace(/_/g, '-'); + filename = overrides[filename] ?? filename; + + if (!filename.endsWith('-mcp')) { + filename += '-mcp'; + } + + return filename; +}; + + + useEffect(() => { + if (server.link) { + fetchGitHubStars(server.link).then(stars => { + setGithubStars(stars); + }); + } + }, [server.link]); + return (
@@ -27,7 +58,14 @@ function ExtensionDetail({ server }: { server: MCPServer }) {
-
+
+ + +

@@ -71,9 +109,23 @@ function ExtensionDetail({ server }: { server: MCPServer }) {

Command

- - {`goose session --with-extension "${server.command}"`} - + {(server.type === "local" || !server.type) ? ( + + {`goose session --with-extension "${server.command}"`} + + ) : server.type === "remote" ? ( + + {`goose session --with-remote-extension "${server.url}"`} + + ) : server.type === "streamable-http" ? ( + + {`goose session --with-streamable-http-extension "${server.url}"`} + + ) : ( + + No command available + + )}
)} @@ -115,15 +167,17 @@ function ExtensionDetail({ server }: { server: MCPServer }) { )}
- - - {server.githubStars} on Github - + {githubStars !== null && ( + + + {formatStarCount(githubStars)} on Github + + )} {server.is_builtin ? (
{ + const repo = extractRepoFromUrl(repoUrl); + if (!repo) return null; + + const cachedStars = getCachedStars(repo); + if (cachedStars !== null) { + return cachedStars; + } + + try { + const response = await fetch(`https://api.github.com/repos/${repo}`, { + headers: { + 'Accept': 'application/vnd.github.v3+json', + } + }); + + if (!response.ok) { + return null; + } + + const data = await response.json(); + const stars = data.stargazers_count || 0; + + setCachedStars(repo, stars); + + return stars; + } catch { + return null; + } +} + +/** + * Format star count for display + */ +export function formatStarCount(stars: number): string { + if (stars >= 1000) { + return `${(stars / 1000).toFixed(1)}k`; + } + return stars.toString(); +} diff --git a/documentation/src/utils/mcp-servers.ts b/documentation/src/utils/mcp-servers.ts index eb99b5a0..e7f9b263 100644 --- a/documentation/src/utils/mcp-servers.ts +++ b/documentation/src/utils/mcp-servers.ts @@ -9,7 +9,6 @@ export async function fetchMCPServers(): Promise { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); - console.log('Fetched MCP servers data:', data); return data; } catch (error) { console.error("Error fetching MCP servers:", error); diff --git a/documentation/static/servers.json b/documentation/static/servers.json index c4f86460..cc6eb814 100644 --- a/documentation/static/servers.json +++ b/documentation/static/servers.json @@ -8,7 +8,6 @@ "installation_notes": "This is a built-in extension that comes with goose by default. No installation required.", "is_builtin": true, "endorsed": true, - "githubStars": 356, "environmentVariables": [] }, { @@ -20,7 +19,6 @@ "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": [] }, { @@ -32,7 +30,6 @@ "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": [] }, { @@ -44,7 +41,6 @@ "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": [] }, { @@ -56,7 +52,6 @@ "installation_notes": "Install using npx package manager. Note: Default memory graph location may be hard to find where npx installs the module.", "is_builtin": false, "endorsed": true, - "githubStars": 7271, "environmentVariables": [] }, { @@ -68,19 +63,6 @@ "installation_notes": "Install using uvx package manager. Note: Some sites may block access via robots.txt.", "is_builtin": false, "endorsed": true, - "githubStars": 7271, - "environmentVariables": [] - }, - { - "id": "git", - "name": "Git", - "description": "Git version control system integration", - "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, - "endorsed": true, - "githubStars": 7271, "environmentVariables": [] }, { @@ -92,7 +74,6 @@ "installation_notes": "Install using uvx package manager. Requires Tavily API key.", "is_builtin": false, "endorsed": true, - "githubStars": 4, "environmentVariables": [ { "name": "TAVILY_API_KEY", @@ -106,11 +87,10 @@ "name": "Figma", "description": "Figma design tool integration", "command": "npx -y @hapins/figma-mcp", - "link": "https://www.npmjs.com/package/@hapins/figma-mcp", + "link": "https://github.com/hapins/figma-mcp", "installation_notes": "Install using npx package manager. Requires Figma access token from user settings.", "is_builtin": false, - "endorsed": true, - "githubStars": 0, + "endorsed": false, "environmentVariables": [ { "name": "FIGMA_ACCESS_TOKEN", @@ -128,7 +108,6 @@ "installation_notes": "Install using uvx package manager.", "is_builtin": false, "endorsed": true, - "githubStars": 1, "environmentVariables": [] }, { @@ -139,8 +118,7 @@ "link": "https://github.com/block/vscode-mcp", "installation_notes": "Install using npx package manager.", "is_builtin": false, - "endorsed": false, - "githubStars": 27, + "endorsed": true, "environmentVariables": [] }, { @@ -152,19 +130,19 @@ "installation_notes": "Install using uvx package manager. Requires PortAudio to be installed on your system for PyAudio to capture audio from your microphone.", "is_builtin": false, "endorsed": true, - "githubStars": 43, "environmentVariables": [] }, { "id": "pieces", "name": "Pieces", - "description": "Provides access to your Pieces Long-Term Memory. You need to have Pieces installed to use this.", + "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", "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.", "is_builtin": false, - "endorsed": false, - "environmentVariables": [] + "endorsed": true, + "environmentVariables": [], + "type": "remote" }, { "id": "playwright", @@ -175,7 +153,392 @@ "installation_notes": "Install using npx package manager.", "is_builtin": false, "endorsed": true, - "githubStars": 12309, + "environmentVariables": [] + }, + { + "id": "agentql-mcp", + "name": "AgentQL", + "description": "Transform unstructured web content into structured data", + "command": "npx -y agentql-mcp", + "link": "https://github.com/tinyfish-io/agentql-mcp", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [ + { + "name": "AGENTQL_API_KEY", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "alby-mcp", + "name": "Alby", + "description": "Bitcoin Lightning Network integration", + "command": "npx -y @getalby/alby-mcp-server", + "link": "https://github.com/getalby/mcp", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [ + { + "name": "ALBY_API_TOKEN", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "asana-mcp", + "name": "Asana", + "description": "Task automation, project tracking, and team collaboration", + "command": "npx -y @roychri/mcp-server-asana", + "link": "https://github.com/roychri/mcp-server-asana", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [ + { + "name": "ASANA_ACCESS_TOKEN", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "blender-mcp", + "name": "Blender", + "description": "3D modeling and animation integration", + "command": "npx -y blender-mcp", + "link": "https://github.com/ahujasid/blender-mcp", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [] + }, + { + "id": "brave-mcp", + "name": "Brave Search", + "description": "Web search capabilities powered by Brave", + "command": "npx -y @brave/brave-search-mcp", + "link": "https://github.com/brave/brave-search-mcp", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": true, + "environmentVariables": [ + { + "name": "BRAVE_API_KEY", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "browserbase-mcp", + "name": "Browserbase", + "description": "Browser automation and web scraping", + "command": "npx -y @browserbasehq/mcp-server-browserbase", + "link": "https://github.com/browserbase/mcp-server-browserbase", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": true, + "environmentVariables": [ + { + "name": "BROWSERBASE_API_KEY", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "cloudflare-mcp", + "name": "Cloudflare", + "description": "Cloudflare API integration for DNS and domain management", + "command": "npx -y @cloudflare/mcp-server-cloudflare", + "link": "https://github.com/cloudflare/mcp-server-cloudflare", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": true, + "environmentVariables": [ + { + "name": "CLOUDFLARE_API_TOKEN", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "cloudinary-asset-management-mcp", + "name": "Cloudinary Asset Management", + "description": "Cloud-based image and video management", + "command": "npx -y cloudinary-asset-management-mcp", + "link": "https://github.com/cloudinary/asset-management-js", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": true, + "environmentVariables": [ + { + "name": "CLOUDINARY_CLOUD_NAME", + "description": "Required environment variable", + "required": true + }, + { + "name": "CLOUDINARY_API_KEY", + "description": "Required environment variable", + "required": true + }, + { + "name": "CLOUDINARY_API_SECRET", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "cognee-mcp", + "name": "Cognee", + "description": "Knowledge graph and cognitive AI capabilities", + "command": "uvx cognee-mcp", + "link": "https://github.com/topoteretes/cognee", + "installation_notes": "Install using uvx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [] + }, + { + "id": "elevenlabs-mcp", + "name": "ElevenLabs", + "description": "Text-to-speech and voice synthesis", + "command": "npx -y elevenlabs-mcp", + "link": "https://github.com/elevenlabs/elevenlabs-mcp", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": true, + "environmentVariables": [ + { + "name": "ELEVENLABS_API_KEY", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "filesystem-mcp", + "name": "Filesystem", + "description": "File system operations and management", + "command": "uvx mcp-server-filesystem", + "link": "https://github.com/modelcontextprotocol/servers", + "installation_notes": "Install using uvx package manager.", + "is_builtin": false, + "endorsed": true, + "environmentVariables": [] + }, + { + "id": "github-mcp", + "name": "GitHub", + "description": "GitHub repository management and operations", + "url": "https://api.githubcopilot.com/mcp/", + "link": "https://github.com/github/github-mcp-server", + "installation_notes": "This is a remote extension. Configure using the endpoint URL in Goose settings.", + "is_builtin": false, + "endorsed": true, + "environmentVariables": [ + { + "name": "GITHUB_PERSONAL_ACCESS_TOKEN", + "description": "Required environment variable", + "required": true + } + ], + "type": "streamable-http" + }, + { + "id": "google-drive-mcp", + "name": "Google Drive", + "description": "Google Drive file management and operations", + "command": "npx -y @google/drive-mcp", + "link": "https://github.com/google/drive-mcp", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": true, + "environmentVariables": [ + { + "name": "GOOGLE_DRIVE_CREDENTIALS", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "google-maps-mcp", + "name": "Google Maps", + "description": "Maps, geocoding, and location services", + "command": "npx -y @google/maps-mcp", + "link": "https://github.com/google/maps-mcp", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": true, + "environmentVariables": [ + { + "name": "GOOGLE_MAPS_API_KEY", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "mbot-mcp", + "name": "MBot", + "description": "Chatbot and conversational AI integration", + "command": "npx -y mbot-mcp", + "link": "https://github.com/deemkeen/mbotmcp", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [] + }, + { + "id": "netlify-mcp", + "name": "Netlify", + "description": "Web deployment and hosting automation", + "command": "npx -y netlify-mcp", + "link": "https://github.com/netlify/netlify-mcp", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [ + { + "name": "NETLIFY_ACCESS_TOKEN", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "nostrbook-mcp", + "name": "NostrBook", + "description": "Nostr protocol integration for decentralized social", + "command": "npx -y nostrbook-mcp", + "link": "https://github.com/nostrbook/nostrbook-mcp", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [] + }, + { + "id": "postgres-mcp", + "name": "PostgreSQL", + "description": "PostgreSQL database integration", + "command": "uvx mcp-server-postgres", + "link": "https://github.com/modelcontextprotocol/servers", + "installation_notes": "Install using uvx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [ + { + "name": "POSTGRES_CONNECTION_STRING", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "puppeteer-mcp", + "name": "Puppeteer", + "description": "Browser automation and web scraping", + "command": "npx -y @puppeteer/mcp-server", + "link": "https://github.com/puppeteer/mcp-server", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [] + }, + { + "id": "reddit-mcp", + "name": "Reddit", + "description": "Reddit API integration for posts and comments", + "command": "npx -y reddit-mcp", + "link": "https://github.com/adhikasp/mcp-reddit", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [ + { + "name": "REDDIT_CLIENT_ID", + "description": "Required environment variable", + "required": true + }, + { + "name": "REDDIT_CLIENT_SECRET", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "repomix-mcp", + "name": "Repomix", + "description": "Repository analysis and code organization", + "command": "npx -y repomix-mcp", + "link": "https://github.com/yamadashy/repomix", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [] + }, + { + "id": "selenium-mcp", + "name": "Selenium", + "description": "Web browser automation and testing", + "command": "npx -y selenium-mcp", + "link": "https://github.com/angiejones/mcp-selenium", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [] + }, + { + "id": "square-mcp", + "name": "Square", + "description": "Square API for payments and business management", + "command": "npx square-mcp-server start", + "link": "https://github.com/square/square-mcp-server", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [ + { + "name": "ACCESS_TOKEN", + "description": "Required environment variable", + "required": true + }, + { + "name": "SANDBOX", + "description": "Required environment variable", + "required": true + } + ] + }, + { + "id": "tutorial-mcp", + "name": "Tutorial", + "description": "Tutorial and learning management system", + "command": "npx -y tutorial-mcp", + "link": "https://github.com/tutorial/tutorial-mcp", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, + "environmentVariables": [] + }, + { + "id": "youtube-transcript-mcp", + "name": "YouTube Transcript", + "description": "YouTube video transcript extraction", + "command": "npx -y youtube-transcript-mcp", + "link": "https://github.com/jkawamoto/mcp-youtube-transcript", + "installation_notes": "Install using npx package manager.", + "is_builtin": false, + "endorsed": false, "environmentVariables": [] } -] +] \ No newline at end of file