|
| 1 | +#mcpcurl |
| 2 | + |
| 3 | +A CLI tool that dynamically builds commands based on schemas retrieved from MCP servers that can |
| 4 | +be executed against the configured MCP server. |
| 5 | + |
| 6 | +##Overview |
| 7 | + |
| 8 | +`mcpcurl` is a command-line interface that: |
| 9 | + |
| 10 | +1. Connects to an MCP server via stdio |
| 11 | +2. Dynamically retrieves the available tools schema |
| 12 | +3. Generates CLI commands corresponding to each tool |
| 13 | +4. Handles parameter validation based on the schema |
| 14 | +5. Executes commands and displays responses |
| 15 | + |
| 16 | +##Installation |
| 17 | + |
| 18 | +##Usage |
| 19 | + |
| 20 | +```bash |
| 21 | +mcpcurl --stdio-server-cmd="<command to start MCP server>"<command> [flags] |
| 22 | +``` |
| 23 | + |
| 24 | +The`--stdio-server-cmd` flag is required for all commands and specifies the command to run the MCP server. |
| 25 | + |
| 26 | +###Available Commands |
| 27 | + |
| 28 | +-`tools`: Contains all dynamically generated tool commands from the schema |
| 29 | +-`schema`: Fetches and displays the raw schema from the MCP server |
| 30 | +-`help`: Shows help for any command |
| 31 | + |
| 32 | +###Examples |
| 33 | + |
| 34 | +List available tools in Anthropic's MCP server: |
| 35 | + |
| 36 | +```bash |
| 37 | +% ./mcpcurl --stdio-server-cmd"docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN mcp/github" tools --help |
| 38 | +Contains all dynamically generated tool commands from the schema |
| 39 | + |
| 40 | +Usage: |
| 41 | + mcpcurl tools [command] |
| 42 | + |
| 43 | +Available Commands: |
| 44 | + add_issue_comment Add a comment to an existing issue |
| 45 | + create_branch Create a new branchin a GitHub repository |
| 46 | + create_issue Create a new issuein a GitHub repository |
| 47 | + create_or_update_file Create or update a single filein a GitHub repository |
| 48 | + create_pull_request Create a new pull requestin a GitHub repository |
| 49 | + create_repository Create a new GitHub repositoryin your account |
| 50 | + fork_repository Fork a GitHub repository to your account or specified organization |
| 51 | + get_file_contents Get the contents of a file or directory from a GitHub repository |
| 52 | + get_issue Get details of a specific issuein a GitHub repository. |
| 53 | + list_commits Get list of commits of a branchin a GitHub repository |
| 54 | + list_issues List issuesin a GitHub repository with filtering options |
| 55 | + push_files Push multiple files to a GitHub repositoryin a single commit |
| 56 | + search_code Searchfor code across GitHub repositories |
| 57 | + search_issues Searchfor issues and pull requests across GitHub repositories |
| 58 | + search_repositories Searchfor GitHub repositories |
| 59 | + search_users Searchfor users on GitHub |
| 60 | + update_issue Update an existing issuein a GitHub repository |
| 61 | + |
| 62 | +Flags: |
| 63 | + -h, --helphelpfor tools |
| 64 | + |
| 65 | +Global Flags: |
| 66 | + --pretty Pretty print MCP response (onlyfor JSON responses) (default true) |
| 67 | + --stdio-server-cmd string Shellcommand to invoke MCP server via stdio (required) |
| 68 | + |
| 69 | +Use"mcpcurl tools [command] --help"for more information about a command. |
| 70 | +``` |
| 71 | + |
| 72 | +Get help for a specific tool: |
| 73 | + |
| 74 | +```bash |
| 75 | + % ./mcpcurl --stdio-server-cmd"docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN mcp/github" tools get_issue --help |
| 76 | +Get details of a specific issuein a GitHub repository. |
| 77 | + |
| 78 | +Usage: |
| 79 | + mcpcurl tools get_issue [flags] |
| 80 | + |
| 81 | +Flags: |
| 82 | + -h, --helphelpfor get_issue |
| 83 | + --issue_number float |
| 84 | + --owner string |
| 85 | + --repo string |
| 86 | + |
| 87 | +Global Flags: |
| 88 | + --pretty Pretty print MCP response (onlyfor JSON responses) (default true) |
| 89 | + --stdio-server-cmd string Shellcommand to invoke MCP server via stdio (required) |
| 90 | + |
| 91 | +``` |
| 92 | + |
| 93 | +Use one of the tools: |
| 94 | + |
| 95 | +```bash |
| 96 | + % ./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 |
| 97 | +{ |
| 98 | +"active_lock_reason": null, |
| 99 | +"assignee": null, |
| 100 | +"assignees": [], |
| 101 | +"author_association":"CONTRIBUTOR", |
| 102 | + "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", |
| 103 | +"closed_at":"2014-12-08T10:02:16Z", |
| 104 | +"closed_by": null, |
| 105 | +"comments": 12, |
| 106 | +"comments_url":"https://api.github.com/repos/golang/go/issues/1/comments", |
| 107 | +"created_at":"2009-10-22T06:07:26Z", |
| 108 | +"events_url":"https://api.github.com/repos/golang/go/issues/1/events", |
| 109 | + [...] |
| 110 | +} |
| 111 | +``` |
| 112 | + |
| 113 | +##Dynamic Commands |
| 114 | + |
| 115 | +All tools provided by the MCP server are automatically available as subcommands under the`tools` command. Each generated command has: |
| 116 | + |
| 117 | +- Appropriate flags matching the tool's input schema |
| 118 | +- Validation for required parameters |
| 119 | +- Type validation |
| 120 | +- Enum validation (for string parameters with allowable values) |
| 121 | +- Help text generated from the tool's description |
| 122 | + |
| 123 | +##How It Works |
| 124 | + |
| 125 | +1.`mcpcurl` makes a JSON-RPC request to the server using the`tools/list` method |
| 126 | +2. The server responds with a schema describing all available tools |
| 127 | +3.`mcpcurl` dynamically builds a command structure based on this schema |
| 128 | +4. When a command is executed, arguments are converted to a JSON-RPC request |
| 129 | +5. The request is sent to the server via stdin, and the response is printed to stdout |