A Go implementation of the Model Context Protocol (MCP), providing a framework for building MCP servers and clients.
To install the go-go-mcp
command line tool with homebrew, run:
brew tap go-go-golems/go-go-go
brew install go-go-golems/go-go-go/go-go-mcp
To install the go-go-mcp
command using apt-get, run:
echo "deb [trusted=yes] https://apt.fury.io/go-go-golems/ /" >> /etc/apt/sources.list.d/fury.list
apt-get update
apt-get install go-go-mcp
To install using yum
, run:
echo "
[fury]
name=Gemfury Private Repo
baseurl=https://yum.fury.io/go-go-golems/
enabled=1
gpgcheck=0
" >> /etc/yum.repos.d/fury.repo
yum install go-go-mcp
To install using go get
, run:
go get -u github.com/go-go-golems/go-go-mcp/cmd/go-go-mcp
Finally, install by downloading the binaries straight from github.
This project implements the Model Context Protocol, which enables standardized communication between AI applications and language models. The implementation includes:
-
MCP server and client
-
Support for SSE and stdio transports
-
Bridge to expose an SSE server as a stdio server
-
Templated shell scripts as MCP tools
-
Configuration files for profiles
-
Core protocol message types and interfaces
-
A modular registry system for managing prompts, resources, and tools
-
Support for custom handlers and subscriptions
The server implements the MCP specification methods:
initialize
- Protocol initialization and capability negotiationping
- Connection health checkprompts/list
- List available promptsprompts/get
- Retrieve prompt contentresources/list
- List available resourcesresources/read
- Read resource contenttools/list
- List available toolstools/call
- Execute a tool
Not yet implemented:
- notifications
resources/subscribe
- Subscribe to resource updates
The binary can be run in a few different modes:
- Server mode: Run as an MCP server process
- Client mode: Use client commands to interact with an MCP server
- Bridge mode: Expose an SSE server as a stdio server
Start the server with either stdio or SSE transport:
# Start with stdio transport (default)
go-go-mcp server start --transport stdio
# Start with SSE transport
go-go-mcp server start --transport sse --port 3001
The server automatically watches configured repositories and files for changes, reloading tools when:
- Files are added or removed from watched directories
- Tool configuration files are modified
- Repository structure changes
This allows for dynamic tool updates without server restarts.
You can interact with tools directly without starting a server using the server tools
commands:
# List available tools using the 'all' profile
go-go-mcp server tools list --profile all
# List only system monitoring tools
go-go-mcp server tools list --profile system
# Call a tool directly
go-go-mcp server tools call system-monitor --args format=json,metrics=cpu,memory
# Call a tool with JSON arguments
go-go-mcp server tools call calendar-event --json '{
"title": "Team Meeting",
"start_time": "2024-02-01 10:00",
"duration": 60
}'
The available tools depend on the selected profile:
# System monitoring profile
go-go-mcp server tools list --profile system
# Shows: system-monitor, disk-usage, etc.
# Calendar profile
go-go-mcp server tools list --profile calendar
# Shows: calendar-event, calendar-availability, etc.
# Data analysis profile
go-go-mcp server tools list --profile data
# Shows: data-analyzer, data-visualizer, etc.
Use the client subcommand to interact with an MCP server:
# List available prompts (uses default server: go-go-mcp server start --transport stdio)
go-go-mcp client prompts list
# List available tools
go-go-mcp client tools list
# Execute a prompt with arguments
go-go-mcp client prompts execute hello --args '{"name":"World"}'
# Call a tool with arguments
go-go-mcp client tools call echo --args '{"message":"Hello, MCP!"}'
You can customize the server command and arguments if needed:
# Use a different server binary with custom arguments
go-go-mcp client --command custom-server,start,--debug,--port,8001 prompts list
# Use a server with a specific configuration
go-go-mcp client -c go-go-mcp,start,--config,config.yaml prompts list
go-go-mcp can be used as a bridge to expose an SSE server as a stdio server. This is useful when you need to connect a stdio-based client to an SSE server:
# Start an SSE server on port 3000
go-go-mcp server start --transport sse --port 3000
# In another terminal, start the bridge to expose the SSE server as stdio
go-go-mcp bridge --sse-url http://localhost:3000 --log-level debug
# Now you can use stdio-based clients to connect to the bridge
This is particularly useful when integrating with tools that only support stdio communication but need to connect to a web-based MCP server.
Add the --debug
flag to enable detailed logging:
go-go-mcp server start --debug
Check the version:
go-go-mcp -v
go-go-mcp can be configured using YAML configuration files that allow you to:
- Define multiple profiles for different environments
- Configure tool and prompt sources
- Set parameter defaults and overrides
- Control access through blacklists/whitelists
- Manage security through parameter filtering
The config
command group provides tools to manage your configuration:
# Create a new configuration file
go-go-mcp config init
# Edit configuration in your default editor
go-go-mcp config edit
# List available profiles
go-go-mcp config list-profiles
# Show details of a specific profile
go-go-mcp config show-profile default
# Add a tool directory to a profile
go-go-mcp config add-tool default --dir ./tools/system
# Add a specific tool file to a profile
go-go-mcp config add-tool default --file ./tools/special-tool.yaml
# Create a new profile
go-go-mcp config add-profile production "Production environment configuration"
# Duplicate an existing profile
go-go-mcp config duplicate-profile development staging "Staging environment configuration"
# Set the default profile
go-go-mcp config set-default-profile production
For detailed configuration documentation, use:
# View configuration file documentation
go-go-mcp help config-file
# View example configuration
go-go-mcp help config-file --example
go-go-mcp supports defining custom shell commands in YAML files, providing:
- Template-based command generation with Go templates and Sprig functions
- Rich parameter type system
- Environment variable management
- Working directory control
- Error handling and output capture
The examples/
directory contains various ready-to-use commands. You can view the schema for any command using go-go-mcp schema <command.yaml>
, which shows the full parameter documentation that is passed to the LLM:
go-go-mcp schema examples/github/list-github-issues.yaml
examples/github/list-github-issues.yaml
- List and filter GitHub issuesexamples/github/list-pull-requests.yaml
- List and filter pull requests
examples/shell-commands/fetch-url.yaml
- Fetch and process web contentexamples/html-extract/pubmed.yaml
- Search and extract data from PubMed
examples/shell-commands/diary-append.yaml
- Maintain a timestamped diaryexamples/shell-commands/fetch-transcript.yaml
- Download YouTube video transcripts
For any command, you can view its full schema and documentation using:
# View the full parameter schema and documentation
go-go-mcp schema examples/github/list-github-issues.yaml
# View the command help
go-go-mcp run-command examples/github/list-github-issues.yaml --help
You can run shell commands directly using the run-command
subcommand. This allows you to execute any shell command YAML file without loading it into a server first:
# View command help and available flags
go-go-mcp run-command examples/github/list-github-issues.yaml --help
# Run a command with specific parameters
go-go-mcp run-command examples/github/list-github-issues.yaml --author wesen
# Run a Google Calendar command
go-go-mcp run-command examples/google/get-calendar.yaml --start today --end "next week"
# Run a URL fetching command
go-go-mcp run-command examples/shell-commands/fetch-url.yaml --url https://example.com
This provides a simpler way to use shell commands as standalone command-line tools without setting up a server.
You can use Pinocchio to generate shell commands for go-go-mcp. First, add your local go-go-mcp repository as a Pinocchio repository:
pinocchio config repositories add $(pwd)/pinocchio
Then generate a new command using:
pinocchio go-go-mcp create-command --description "A command description"
This will create a new shell command YAML file with the appropriate structure and configuration.
For detailed shell commands documentation, use:
# View shell commands documentation
go-go-mcp help shell-commands
# View example shell commands
go-go-mcp help shell-commands --example
go-go-mcp comes with comprehensive built-in documentation. To explore:
# List all available help topics
go-go-mcp help --all
# Get help on a specific topic
go-go-mcp help <topic>
# Show examples for a topic
go-go-mcp help <topic> --example
A simple YAML-based Domain Specific Language for defining user interfaces.
The DSL supports the following basic components:
text
: Button labeltype
: primary, secondary, danger, successonclick
: JavaScript event handler
content
: Heading text content
content
: Text content
type
: text, email, password, number, telplaceholder
: Placeholder textvalue
: Default valuerequired
: Boolean
placeholder
: Placeholder textrows
: Number of rowscols
: Number of columnsvalue
: Default value
label
: Checkbox labelchecked
: Booleanrequired
: Booleanname
: Form field name
type
: ul or olitems
: Array of items or nested components
All components support these common attributes:
id
: Unique identifierstyle
: Inline CSSdisabled
: Booleandata
: Map of data attributes
form:
id: signup-form
components:
- title:
content: Sign Up
- text:
content: Please fill in your details below.
- input:
type: email
placeholder: Email address
- button:
text: Submit
type: primary
See ui-dsl.yaml
for more comprehensive examples.