Universal MCP operations CLI — manage any MCP gateway from one control plane.
mcpops is the Terraform of the MCP ecosystem. Instead of building another gateway, it manages them all through a provider-agnostic plugin architecture.
mcpops status # unified status across all backends mcpops tools list # discover tools across all instances mcpops connect factory edge --mode bridge # federate between gateways mcpops discover factory mqtt # discover IoT devices The MCP gateway space is crowded — MetaMCP, Microsoft MCP Gateway, mcp-iot-gateway, and dozens more. Each has its own CLI, API, and management model. mcpops unifies them behind a single control plane.
- Provider-agnostic: One CLI for all your MCP infrastructure
- Config-as-code: YAML config for your entire MCP topology
- Federation: Connect instances across providers (peer or bridge mode)
- Discovery: Find tools and devices across all backends
- Extensible: Add new providers with a simple TypeScript interface
npm install -g mcpopsOr run directly:
npx mcpops --help# Add an IoT gateway mcpops provider add iot-gateway factory http://192.168.1.100:45678/mcp \ --auth-type api-key --auth-key igt_xxxx # Add a MetaMCP instance mcpops provider add metamcp staging http://localhost:12008 \ --auth-type api-key --auth-key sk_mt_xxxxmcpops statusmcpops status INSTANCE PROVIDER STATUS TOOLS PEERS ────────────────────────────────────────────────────── factory iot-gateway ● connected 42 tools 3 peers staging metamcp ● connected 18 tools 5 peers mcpops tools list mcpops tools list --instance factory mcpops tools call factory iot_discover '{"connection":"mqtt"}'mcpops connect factory staging --mode bridge --livemcpops discover factory mqtt| Command | Description |
|---|---|
mcpops status [instance] | Unified status across all instances |
mcpops provider list | List providers and configured instances |
mcpops provider add <provider> <name> <url> | Add a gateway instance |
mcpops provider remove <name> | Remove an instance |
mcpops tools list [-i instance] | List tools across instances |
mcpops tools call <instance> <tool> [args] | Call a tool |
mcpops connect <from> <to> [--mode] | Federate two instances |
mcpops disconnect <from> <to> | Remove federation |
mcpops discover <instance> [scope] | Discover devices/services |
mcpops config show | Display configuration |
mcpops config export | Export config as YAML |
mcpops config validate | Validate config file |
Config lives at ~/.config/mcpops/config.yaml:
version: 1 instances: factory: provider: iot-gateway url: http://192.168.1.100:45678/mcp auth: type: api-key key: igt_xxxx staging: provider: metamcp url: http://localhost:12008 auth: type: api-key key: sk_mt_xxxx federations: - from: factory to: staging mode: bridgeOverride the config path:
MCPOPS_CONFIG=./my-config.yaml mcpops status| Provider | Description | Federation | Discovery |
|---|---|---|---|
iot-gateway | mcp-iot-gateway | ✅ peer + bridge | ✅ IoT devices |
metamcp | MetaMCP aggregator | — | — |
Implement the Provider abstract class:
import { Provider } from "mcpops"; export class MyGatewayProvider extends Provider { readonly name = "my-gateway"; readonly version = "1.0.0"; readonly capabilities = { canFederate: false, canBridge: false, canDiscover: false, supportsAuth: true, supportsNamespaces: false, }; async connect(config) { /* ... */ } async disconnect(instanceId) { /* ... */ } async healthCheck(instanceId) { /* ... */ } async status(instanceId) { /* ... */ } listInstances() { /* ... */ } async listTools(instanceId) { /* ... */ } async callTool(instanceId, tool, args) { /* ... */ } async shutdown() { /* ... */ } }MIT — Symbia Labs