151 lines
6.3 KiB
Markdown
151 lines
6.3 KiB
Markdown
# mcpcurl
|
|
|
|
A CLI tool that dynamically builds commands based on schemas retrieved from MCP servers that can
|
|
be executed against the configured MCP server.
|
|
|
|
## Overview
|
|
|
|
`mcpcurl` is a command-line interface that:
|
|
|
|
1. Connects to an MCP server via stdio
|
|
2. Dynamically retrieves the available tools schema
|
|
3. Generates CLI commands corresponding to each tool
|
|
4. Handles parameter validation based on the schema
|
|
5. Executes commands and displays responses
|
|
|
|
## Installation
|
|
|
|
### Prerequisites
|
|
- Go 1.24 or later
|
|
- Access to the GitHub MCP Server from either Docker or local build
|
|
|
|
### Build from Source
|
|
```bash
|
|
cd cmd/mcpcurl
|
|
go build -o mcpcurl
|
|
```
|
|
|
|
### Using Go Install
|
|
```bash
|
|
go install github.com/github/github-mcp-server/cmd/mcpcurl@latest
|
|
```
|
|
|
|
### Verify Installation
|
|
```bash
|
|
./mcpcurl --help
|
|
```
|
|
|
|
## Usage
|
|
|
|
```console
|
|
mcpcurl --stdio-server-cmd="<command to start MCP server>" <command> [flags]
|
|
```
|
|
|
|
The `--stdio-server-cmd` flag is required for all commands and specifies the command to run the MCP server.
|
|
|
|
### Available Commands
|
|
|
|
- `tools`: Contains all dynamically generated tool commands from the schema
|
|
- `schema`: Fetches and displays the raw schema from the MCP server
|
|
- `help`: Shows help for any command
|
|
|
|
### Examples
|
|
|
|
List available tools in Github's MCP server:
|
|
|
|
```console
|
|
% ./mcpcurl --stdio-server-cmd "docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN mcp/github" tools --help
|
|
Contains all dynamically generated tool commands from the schema
|
|
|
|
Usage:
|
|
mcpcurl tools [command]
|
|
|
|
Available Commands:
|
|
add_issue_comment Add a comment to an existing issue
|
|
create_branch Create a new branch in a GitHub repository
|
|
create_issue Create a new issue in a GitHub repository
|
|
create_or_update_file Create or update a single file in a GitHub repository
|
|
create_pull_request Create a new pull request in a GitHub repository
|
|
create_repository Create a new GitHub repository in your account
|
|
fork_repository Fork a GitHub repository to your account or specified organization
|
|
get_file_contents Get the contents of a file or directory from a GitHub repository
|
|
get_issue Get details of a specific issue in a GitHub repository
|
|
get_issue_comments Get comments for a GitHub issue
|
|
list_commits Get list of commits of a branch in a GitHub repository
|
|
list_issues List issues in a GitHub repository with filtering options
|
|
push_files Push multiple files to a GitHub repository in a single commit
|
|
search_code Search for code across GitHub repositories
|
|
search_issues Search for issues and pull requests across GitHub repositories
|
|
search_repositories Search for GitHub repositories
|
|
search_users Search for users on GitHub
|
|
update_issue Update an existing issue in a GitHub repository
|
|
|
|
Flags:
|
|
-h, --help help for tools
|
|
|
|
Global Flags:
|
|
--pretty Pretty print MCP response (only for JSON responses) (default true)
|
|
--stdio-server-cmd string Shell command to invoke MCP server via stdio (required)
|
|
|
|
Use "mcpcurl tools [command] --help" for more information about a command.
|
|
```
|
|
|
|
Get help for a specific tool:
|
|
|
|
```console
|
|
% ./mcpcurl --stdio-server-cmd "docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN mcp/github" tools get_issue --help
|
|
Get details of a specific issue in a GitHub repository
|
|
|
|
Usage:
|
|
mcpcurl tools get_issue [flags]
|
|
|
|
Flags:
|
|
-h, --help help for get_issue
|
|
--issue_number float
|
|
--owner string
|
|
--repo string
|
|
|
|
Global Flags:
|
|
--pretty Pretty print MCP response (only for JSON responses) (default true)
|
|
--stdio-server-cmd string Shell command to invoke MCP server via stdio (required)
|
|
|
|
```
|
|
|
|
Use one of the tools:
|
|
|
|
```console
|
|
% ./mcpcurl --stdio-server-cmd "docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN mcp/github" tools get_issue --owner golang --repo go --issue_number 1
|
|
{
|
|
"active_lock_reason": null,
|
|
"assignee": null,
|
|
"assignees": [],
|
|
"author_association": "CONTRIBUTOR",
|
|
"body": "by **rsc+personal@swtch.com**:\n\n\u003cpre\u003eWhat steps will reproduce the problem?\n1. Run build on Ubuntu 9.10, which uses gcc 4.4.1\n\nWhat is the expected output? What do you see instead?\n\nCgo fails with the following error:\n\n{{{\ngo/misc/cgo/stdio$ make\ncgo file.go\ncould not determine kind of name for C.CString\ncould not determine kind of name for C.puts\ncould not determine kind of name for C.fflushstdout\ncould not determine kind of name for C.free\nthrow: sys·mapaccess1: key not in map\n\npanic PC=0x2b01c2b96a08\nthrow+0x33 /media/scratch/workspace/go/src/pkg/runtime/runtime.c:71\n throw(0x4d2daf, 0x0)\nsys·mapaccess1+0x74 \n/media/scratch/workspace/go/src/pkg/runtime/hashmap.c:769\n sys·mapaccess1(0xc2b51930, 0x2b01)\nmain·*Prog·loadDebugInfo+0xa67 \n/media/scratch/workspace/go/src/cmd/cgo/gcc.go:164\n main·*Prog·loadDebugInfo(0xc2bc0000, 0x2b01)\nmain·main+0x352 \n/media/scratch/workspace/go/src/cmd/cgo/main.go:68\n main·main()\nmainstart+0xf \n/media/scratch/workspace/go/src/pkg/runtime/amd64/asm.s:55\n mainstart()\ngoexit /media/scratch/workspace/go/src/pkg/runtime/proc.c:133\n goexit()\nmake: *** [file.cgo1.go] Error 2\n}}}\n\nPlease use labels and text to provide additional information.\u003c/pre\u003e\n",
|
|
"closed_at": "2014-12-08T10:02:16Z",
|
|
"closed_by": null,
|
|
"comments": 12,
|
|
"comments_url": "https://api.github.com/repos/golang/go/issues/1/comments",
|
|
"created_at": "2009-10-22T06:07:26Z",
|
|
"events_url": "https://api.github.com/repos/golang/go/issues/1/events",
|
|
[...]
|
|
}
|
|
```
|
|
|
|
## Dynamic Commands
|
|
|
|
All tools provided by the MCP server are automatically available as subcommands under the `tools` command. Each generated command has:
|
|
|
|
- Appropriate flags matching the tool's input schema
|
|
- Validation for required parameters
|
|
- Type validation
|
|
- Enum validation (for string parameters with allowable values)
|
|
- Help text generated from the tool's description
|
|
|
|
## How It Works
|
|
|
|
1. `mcpcurl` makes a JSON-RPC request to the server using the `tools/list` method
|
|
2. The server responds with a schema describing all available tools
|
|
3. `mcpcurl` dynamically builds a command structure based on this schema
|
|
4. When a command is executed, arguments are converted to a JSON-RPC request
|
|
5. The request is sent to the server via stdin, and the response is printed to stdout
|