| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- import { cmd } from "./cmd"
- import { Client } from "@modelcontextprotocol/sdk/client/index.js"
- import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
- import * as prompts from "@clack/prompts"
- import { UI } from "../ui"
- export const McpCommand = cmd({
- command: "mcp",
- builder: (yargs) => yargs.command(McpAddCommand).demandCommand(),
- async handler() {},
- })
- export const McpAddCommand = cmd({
- command: "add",
- describe: "add an MCP server",
- async handler() {
- UI.empty()
- prompts.intro("Add MCP server")
- const name = await prompts.text({
- message: "Enter MCP server name",
- validate: (x) => (x && x.length > 0 ? undefined : "Required"),
- })
- if (prompts.isCancel(name)) throw new UI.CancelledError()
- const type = await prompts.select({
- message: "Select MCP server type",
- options: [
- {
- label: "Local",
- value: "local",
- hint: "Run a local command",
- },
- {
- label: "Remote",
- value: "remote",
- hint: "Connect to a remote URL",
- },
- ],
- })
- if (prompts.isCancel(type)) throw new UI.CancelledError()
- if (type === "local") {
- const command = await prompts.text({
- message: "Enter command to run",
- placeholder: "e.g., opencode x @modelcontextprotocol/server-filesystem",
- validate: (x) => (x && x.length > 0 ? undefined : "Required"),
- })
- if (prompts.isCancel(command)) throw new UI.CancelledError()
- prompts.log.info(`Local MCP server "${name}" configured with command: ${command}`)
- prompts.outro("MCP server added successfully")
- return
- }
- if (type === "remote") {
- const url = await prompts.text({
- message: "Enter MCP server URL",
- placeholder: "e.g., https://example.com/mcp",
- validate: (x) => {
- if (!x) return "Required"
- if (x.length === 0) return "Required"
- const isValid = URL.canParse(x)
- return isValid ? undefined : "Invalid URL"
- },
- })
- if (prompts.isCancel(url)) throw new UI.CancelledError()
- const client = new Client({
- name: "opencode",
- version: "1.0.0",
- })
- const transport = new StreamableHTTPClientTransport(new URL(url))
- await client.connect(transport)
- prompts.log.info(`Remote MCP server "${name}" configured with URL: ${url}`)
- }
- prompts.outro("MCP server added successfully")
- },
- })
|