An MCP server that exposes 69 developer tools to any MCP-compatible LLM client — file I/O, shell execution, search, system info, and interactive user dialogs.
Communication happens over stdio using the mark3labs/mcp-go library.
- 69 tools, one binary — covers file ops, search, shell, system, HTTP, clipboard, user interaction, and Binance USDT-M Futures trading
Disable any tool group you don't need with
--disable=binance,user,...(see Disabling tool groups). - Binance USDT-M Futures — market data, account/position queries, leverage/margin config, and gated trading (single + bracket orders) with browser-confirm dialogs and AI-supplied
reasoning - Built-in server instructions — the AI receives a categorized guide on when and how to use each tool
- Interactive dialogs —
ask_useropens a browser dialog with choices, markdown, live updates, and typing indicators - Cross-platform — macOS, Windows, and Linux (user dialogs require macOS/Windows;
notify_userworks everywhere) - Surgical editing —
edit_filewith near-miss probe, CRLF transparency, batch mode, and regex support - Performance-first — batch tools (
read_multiple_files,write_multiple_files,path_exists_batch,get_multiple_file_info,edit_filebatch mode) reduce round-trips
Grab a pre-built binary from the Releases page.
Claude Desktop — add to claude_desktop_config.json:
{
"mcpServers": {
"bmcptools": {
"command": "/absolute/path/to/bmcptools"
}
}
}Cursor / Copilot / other clients — point the command field at the same binary path.
Don't need every group? Pass --disable=GROUPS (CSV) when launching the binary, or set the BMCPTOOLS_DISABLE env var. The flag wins when both are set.
# Drop Binance and the interactive user prompts
bmcptools --disable=binance,user
# Same via env (handy in MCP client configs)
BMCPTOOLS_DISABLE=binance bmcptools
# List valid group names
bmcptools --list-groupsAvailable groups: user, file, multi, dir, search, exec, system, binance. The server instructions sent to the LLM are auto-trimmed to match — disabled sections are removed so the model isn't told about tools it can't see.
For Claude Desktop / Cursor configs:
{
"mcpServers": {
"bmcptools": {
"command": "/absolute/path/to/bmcptools",
"args": ["--disable=binance"]
}
}
}| Tool | Description |
|---|---|
read_file |
Read a file with encoding auto-detection. Supports start_line/end_line, multi-range (ranges param), head/tail, show_line_numbers, and byte limits. Binary → base64. |
write_file |
Create or overwrite a file. Auto-creates parent dirs. Returns a unified diff when overwriting (configurable via show_diff). |
append_to_file |
Append content to a file (creates if absent). Returns new file size. |
edit_file |
Surgical find-and-replace. Batch mode, Go regex, CRLF-transparent, near-miss probe, dry-run. Preferred for editing. |
delete_file |
Delete a single file. |
copy_file |
Copy a file. Auto-creates destination parent dirs. |
move_file |
Move or rename a file/directory. Cross-device safe. |
get_file_info |
Metadata: type, size, permissions, mod time, symlink target, line count. |
path_exists |
Lightweight existence check — faster than read_file or get_file_info. |
diff_files |
Unified diff between two files. Cross-platform. |
calculate_checksum |
MD5, SHA1, or SHA256 checksum. Batch-capable. Cross-platform. |
create_symlink |
Create a symbolic link. Cross-platform (may require elevated privileges on Windows). |
compress_files |
Compress files/directories into a zip or tar.gz archive. Auto-detects format from extension. |
extract_archive |
Extract a zip or tar.gz archive. Auto-detects format. Path-traversal protected. |
| Tool | Description |
|---|---|
read_multiple_files |
Read 2+ files in one call. More efficient than repeated read_file. |
write_multiple_files |
Write 2+ files in one call. show_diff defaults to false for performance. |
find_replace_in_files |
Find-and-replace across a directory tree. Regex, glob filter, dry-run, per-file diffs. |
path_exists_batch |
Check whether multiple paths exist in one call. Returns type and size for each. |
get_multiple_file_info |
Return metadata (type, size, modified, permissions, line count) for multiple paths. |
| Tool | Description |
|---|---|
list_directory |
Contents with sizes, timestamps. Recursion, glob filter, sort by name/size. |
directory_tree |
Visual tree view with sizes. Best for project structure overview. |
create_directory |
Create directory + parents (mkdir -p). Idempotent. |
delete_directory |
Delete directory. force=true for non-empty. |
| Tool | Description |
|---|---|
search_files |
Find files by name (glob patterns: *.go, **/*.json, {a,b}). |
grep_files |
Find files by content (literal or regex). Auto/content/files/count output modes, pagination, multiline, glob filter. |
| Tool | Platform | Description |
|---|---|---|
ask_user |
macOS, Windows | Browser dialog with choices, markdown details, live updates, typing detection. Returns token → poll with get_user_response. |
get_user_response |
macOS, Windows | Long-poll for ask_user/rest response. Returns answer or detailed PENDING status (typing, idle, heartbeat). |
update_dialog |
macOS, Windows | Push live markdown updates into an open ask_user dialog. replace_last for streaming progress. |
cancel_ask_user |
macOS, Windows | Dismiss a pending dialog by token. |
notify_user |
All platforms | Fire-and-forget toast notification. level: info/warning/error. |
rest |
macOS, Windows | AI goes idle with a browser "resting" page. Wake-up button. Returns token → poll with get_user_response. |
| Tool | Description |
|---|---|
get_working_directory |
CWD, OS, hostname, and key env vars. Call first to orient. |
run_command |
Shell execution (sh -c / cmd /C). Timeout max 600 s. Supports detach, raw output, stdin, env vars, output capping. |
open_in_app |
Open file/dir/URL in default app. Cross-platform, non-blocking. |
http_request |
HTTP client (all methods). JSON auto-pretty-print. Response capped at 1 MB. Timeout max 300 s. |
list_processes |
Running processes with PID, name, CPU/memory. Filter and sort. |
get_system_info |
CPU, memory, and disk usage snapshot. |
get_env |
Read environment variables. Specific key, filter by name substring, or list all. |
clipboard_read |
Read system clipboard. |
clipboard_write |
Write to system clipboard. |
download_file |
Download a file from a URL to a local path. Streaming (no memory buffering). Auto-creates parent dirs. |
Lets an MCP-connected LLM analyze the market and execute leveraged trades on Binance USDT-M Futures (fapi.binance.com). Read-only market-data tools work without credentials; account/config/trading tools require API key + secret. Mutating tools open a browser confirm dialog (via pkg/confirm) and require the AI to pass a reasoning string. Set BINANCE_SKIP_ASK_USER=true for full autonomy.
Environment variables
| Variable | Required | Default | Purpose |
|---|---|---|---|
BINANCE_API_KEY |
for auth tools | — | API key |
BINANCE_API_SECRET |
for auth tools | — | API secret (HMAC-SHA256 signing) |
BINANCE_FUTURES_BASE_URL |
no | https://fapi.binance.com |
Override base URL (e.g. https://testnet.binancefuture.com for testnet) |
BINANCE_SKIP_ASK_USER |
no | false |
Skip the confirm dialog on every mutating call |
BINANCE_RECV_WINDOW_MS |
no | 5000 |
recvWindow for signed requests (max 60 000) |
Market data — no auth (12)
| Tool | Description |
|---|---|
binance_futures_ping |
Connectivity + server time skew check. |
binance_futures_exchange_info |
Full exchange filters (large; prefer symbol_specs). |
binance_futures_symbol_specs |
Compact per-symbol filters: minNotional, minQty, stepSize, tickSize, maxLeverage, allowed margin/order types. Call before every order. |
binance_futures_klines |
OHLCV candles (ascending order). Intervals 1m..1M. |
binance_futures_ticker_price |
Latest price for one or all symbols. |
binance_futures_ticker_24hr |
24h rolling stats (volume, change %). |
binance_futures_order_book |
Depth (bids/asks) for slippage estimation. |
binance_futures_mark_price |
Mark/index price + next funding rate + funding time. |
binance_futures_open_interest |
Current open interest; history=true for trend. |
binance_futures_long_short_ratio |
Top-trader / global sentiment. |
binance_futures_funding_rate_history |
Historical funding rate series for a symbol (bias / carry analysis). |
binance_futures_ta_snapshot |
One-shot technical-analysis snapshot: EMA(9/21/50), RSI(14), ATR(14), Bollinger(20,2), latest close — ready for the AI to reason over. |
Account & positions — auth required (7)
| Tool | Description |
|---|---|
binance_futures_account_info |
Wallet, available margin, total uPnL, position mode. |
binance_futures_position_risk |
Open positions: size, entry, mark, uPnL, leverage, liquidation. |
binance_futures_open_orders |
Currently working orders. |
binance_futures_order_history |
Historical orders (filled / canceled / expired). |
binance_futures_income_history |
Realized PnL, funding fees, commissions. |
binance_futures_commission_rate |
Per-symbol maker/taker commission rates (for accurate R:R math). |
binance_futures_position_overview |
Account + positions + commission + mark price stitched into one response (ideal for "where do I stand right now?"). |
Account configuration — mutating, gated (3)
| Tool | Description |
|---|---|
binance_futures_change_leverage |
Set leverage per symbol (1..maxLeverage). |
binance_futures_change_margin_type |
ISOLATED or CROSSED per symbol. |
binance_futures_change_position_mode |
Account-wide hedge vs one-way. |
Trading — mutating, gated (6)
| Tool | Description |
|---|---|
binance_futures_place_order |
Single order (MARKET / LIMIT / STOP* / TAKE_PROFIT* / TRAILING_STOP_MARKET). Idempotent via auto-generated newClientOrderId. Supports dryRun=true (uses /order/test). |
binance_futures_place_bracket_order |
Preferred entry point — entry + stop-loss + take-profit in one batch call. Validates SL/TP sides client-side. onPartialFailure: rollback (default) or warn. |
binance_futures_modify_order |
Amend price/quantity of a working LIMIT order (PUT /fapi/v1/order). |
binance_futures_close_position |
Flatten an open position by auto-detecting side + quantity from position_risk, then placing a reduceOnly MARKET (or LIMIT) order. |
binance_futures_cancel_order |
Cancel by orderId or origClientOrderId. |
binance_futures_cancel_all_open_orders |
Cancel all working orders for a symbol. |
Safety model
- Mutating tools build a markdown trade brief (mark price, free margin, current positions, est. notional, SL/TP %, R:R, AI
reasoning) and require user Approve in a browser dialog. - Auto time-sync against
/fapi/v1/time(-1021triggers re-sync + retry). - HTTP 503 Unknown error on order placement is never blind-retried — the tool reconciles via
origClientOrderIdbefore reporting success or asking the user to verify. - Every response includes a
[rate-limit] used_weight_1m=… order_count_1m=…footer so the AI can self-throttle.
Testnet caveats
- Base URL:
https://testnet.binancefuture.com. STOP_MARKET,TAKE_PROFIT_MARKET, andTRAILING_STOP_MARKETare not supported on Futures testnet (returns-4120). As a result,place_bracket_ordercannot fully execute on testnet — the entry leg places fine, but the SL / TP legs will fail and the tool will roll back. Use mainnet (with the smallest allowed notional) to validate brackets end-to-end, or simulate SL/TP with conditionalSTOP/TAKE_PROFITlimit orders on testnet./futures/data/*(long/short ratio, open-interest history) returns HTTP 202 with empty body on testnet — this is a testnet limitation, not a tool bug.
Requirements: Go 1.23+
# Build binary into ./bin/
make build
# Build and stamp with a version tag
make build VERSION=v1.2.3
# Install into $GOBIN
make install VERSION=v1.2.3
# Run tests (root + all internal sub-packages)
make test
# or directly:
go test ./...
# Run linter (requires golangci-lint)
make lintOn Linux/macOS/Windows, make build auto-detects the version from git describe. Pass VERSION=<tag> explicitly to override it, or build without git tags and it will default to "dev".
The codebase follows a modular layout. Public APIs live under pkg/ (importable by external repos); internal implementation lives under internal/.
bmcptools/ ← public API (server.go, registrar.go, toolnames.go)
├── cmd/bmcptools/ ← package main (entry point)
├── scripts/preview/ ← browser UI preview helper
├── pkg/
│ ├── browser/ ← shared HTTP server + browser-open infrastructure
│ ├── confirm/ ← standalone blocking confirm/cancel dialog
│ ├── connector/ ← Connector interface for external tool groups
│ ├── dialog/ ← HTML template contract types (DialogTemplate, RestTemplate)
│ ├── toolname/ ← public tool name constants (importable by connectors)
│ └── toolreg/ ← public ToolRegistrar interface
└── internal/
├── asset/ ← embedded JSON descriptions + HTML/CSS/JS templates
│ └── descriptions/ ← tool descriptions (JSON) + server instructions (TXT)
├── helper/ ← shared utilities (fs, read, diff, edit, mime, glob, checksum)
└── tool/
├── dir/ ← directory tools
├── exec/ ← exec / process tools
├── file/ ← file read/write/edit tools
├── multi/ ← multi-file tools
├── search/ ← search & grep tools
├── system/ ← system info, HTTP, clipboard, processes
├── user/ ← interactive UI tools (ask, notify, rest)
└── binance/ ← Binance USDT-M Futures (market data + signed trading)
import bmcptools "github.com/bearaujus/bmcptools"
s := server.NewMCPServer(bmcptools.ServerName, bmcptools.Version,
server.WithInstructions(bmcptools.ServerInstructions()),
)
bmcptools.Register(s) // all tool groups, default HTML
bmcptools.Register(s, bmcptools.WithUserOptions(
bmcptools.UserWithDialogTemplate(myDialogTmpl), // custom ask_user HTML
))import "github.com/bearaujus/bmcptools/pkg/toolname"
bmcptools.Register(s, bmcptools.WithExcludeTools(
toolname.CompressFiles,
toolname.ExtractArchive,
toolname.CreateSymlink,
))// Skip Binance + interactive user-dialog tools entirely.
// ServerInstructionsExcludingGroups trims the AI prompt to match.
s := server.NewMCPServer(bmcptools.ServerName, bmcptools.Version,
server.WithInstructions(bmcptools.ServerInstructionsExcludingGroups(
bmcptools.GroupBinance, bmcptools.GroupUser,
)),
)
bmcptools.Register(s, bmcptools.WithDisableGroups(
bmcptools.GroupBinance,
bmcptools.GroupUser,
))// Register only the groups you need, with scoped instructions
s := server.NewMCPServer(bmcptools.ServerName, bmcptools.Version,
server.WithInstructions(bmcptools.ServerInstructionsForGroups("file", "search")),
)
bmcptools.RegisterFile(s)
bmcptools.RegisterSearch(s)import (
bmcptools "github.com/bearaujus/bmcptools"
"github.com/bearaujus/bmcptools/pkg/connector"
)
// Your connector implements connector.Connector:
// Name() string
// Register(s toolreg.ToolRegistrar)
bmcptools.RegisterConnectors(s, larkConnector, slackConnector)import "github.com/bearaujus/bmcptools/pkg/dialog"
tmpl, err := dialog.NewDialogTemplate(myHTML) // validated at construction
if err != nil { ... }
bmcptools.RegisterUser(s, bmcptools.UserWithDialogTemplate(tmpl))Each internal/tool/<name>/ package exports a single Register(s toolreg.ToolRegistrar) function. The root Register(s ToolRegistrar) delegates to all of them.
The browser-based tools (ask_user, rest) and the destructive-operation confirm dialog use embedded HTML templates under internal/asset/html/. To preview them locally without running the full MCP server:
# Preview all pages (opens in your default browser)
go run ./scripts/preview
# Preview a specific page
go run ./scripts/preview dialog
go run ./scripts/preview rest
go run ./scripts/preview confirmPushing a tag (v*) triggers the release workflow, which cross-compiles for all platforms and publishes a GitHub release:
| Artifact | Platform |
|---|---|
bmcptools-mac-amd64 |
macOS Intel |
bmcptools-mac-arm64 |
macOS Apple Silicon |
bmcptools-linux-amd64 |
Linux x86-64 |
bmcptools-linux-arm64 |
Linux ARM64 |
bmcptools.exe |
Windows x86-64 |
bmcptools-win-arm64.exe |
Windows ARM64 |
checksums.txt |
SHA256 checksums for all binaries |
The release binaries are not code-signed, so your OS may show a security warning on first run. This is normal for open-source CLI tools distributed as standalone binaries.
Verify integrity first — each release includes a checksums.txt file with SHA256 hashes:
# macOS / Linux
sha256sum -c checksums.txt
# Windows (PowerShell)
Get-FileHash bmcptools.exe -Algorithm SHA256
# Compare the output with the hash in checksums.txtThen unblock the binary:
| OS | How to unblock |
|---|---|
| macOS | Run xattr -d com.apple.quarantine bmcptools-mac-* in Terminal, or right-click the binary → Open → Open |
| Windows | Right-click the .exe → Properties → check Unblock → OK. Or in PowerShell: Unblock-File bmcptools.exe |
| Linux | chmod +x bmcptools-linux-* (no signing issues, just needs execute permission) |
All packages under pkg/ are considered stable public API:
| Package | Stability |
|---|---|
pkg/browser |
Stable — Serve, Open, ServeAndOpen, OpenFn |
pkg/confirm |
Stable — Ask, AskWithHTML, ShowHTML, WithHTML, WithTimeout |
pkg/connector |
Stable — Connector interface |
pkg/dialog |
Stable — DialogTemplate, RestTemplate and their constructors |
pkg/toolname |
Stable — tool name constants |
pkg/toolreg |
Stable — ToolRegistrar interface |
Root-level exports in server.go, registrar.go, and toolnames.go are also stable.
Packages under internal/ are not part of the public API and may change without notice.
See CONTRIBUTING.md for guidelines on adding new tools, project conventions, and known MCP SDK limitations.