Skip to main content
Glama

MCPico

MCP proxy that bundles flat tool lists into hierarchical groups with separate discovery and execution.

MCPico (MCP + "ico" = tiny) wraps upstream MCP servers, grouping their tools into discoverable groups. Each group gets a help_<group> discovery tool (auto-generated docs from upstream schemas) and a <group> execution tool. LLM benchmarks show 43–60% fewer conversation tokens while matching flat tool success rates.

The Problem

MCP servers expose tools as a flat list. Every tool costs context tokens. A filesystem server exposes 14+ separate tools — the model sees all of them, all the time, even when it only needs one.

Some clients add "tool search" as a workaround. But searching requires the model to proactively look for tools it doesn't know exist. No structural signal about which tools relate to each other.

Related MCP server: mcp-compressor

MCPico's Solution

Group related tools under a single entry point. The model sees groups instead of raw tools. Discovery is separated from execution:

Model calls: help_postgres → sees available tools
Model calls: postgres_query {"sql":"SELECT ..."} → executes

Quantified: 43–60% fewer conversation tokens

See BENCHMARK.md for a full LLM evaluation comparing flat tools (45 tools, 5 servers), MCPico merged mode, and MCPico split mode across Qwen3.5-9B and Qwen3.6-35B.

Key results:

  • MCPico split matches flat tool success rates on both models (2/3 tasks)

  • 60% token reduction on 9B model (14,027 vs 34,760 tokens across all tasks)

  • 43% token reduction on single-tool tasks with the 35B model

Features

  • Tool bundling — Groups tools by prefix (configurable separator), collapsing flat tool lists into 10 tools instead of 45+

  • Split discovery/execution — Separate help_<group> tools for discovery, <group> tools for execution. LLM-optimized design

  • Auto-generated helphelp_<group> tools dynamically generate rich documentation from upstream schemas

  • Multi-server aggregation — Proxy multiple upstream MCP servers through one interface

  • Dual upstream transport — Supports both stdio and Streamable HTTP (SSE) upstream servers

  • Dual listen transport — MCPico itself listens via stdio or HTTP/SSE (configurable port)

  • Configurable timeouts — Per-server connection timeout with sensible default (30s)

  • Resource & prompt passthrough — Namespaced to avoid collisions across servers

  • Authentication — Bearer, custom header, and OAuth2 client_credentials with automatic token refresh

  • Listen endpoint auth — Protect the SSE endpoint with bearer token validation

Usage

Install

npm install -g mcpico

Configure

Create mcpico.json:

{
  "servers": [
    {
      "name": "filesystem",
      "transport": {
        "type": "stdio",
        "command": "npx",
        "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed/dir"]
      }
    }
  ]
}

Run

mcpico

Connect your MCP client

Add MCPico as a server in your MCP client config:

{
  "mcpServers": {
    "mcpico": {
      "command": "mcpico",
      "args": ["--config", "/path/to/mcpico.json"]
    }
  }
}

How it works

  1. Connect to upstream MCP servers

  2. Discover their tools (tools/list)

  3. Group tools by prefix (configurable separator, default _)

    • filesystem_read_file, filesystem_write_file → group filesystem

  4. Register two tools per group:

    • help_<group> — discovery: lists all subcommands with their parameters

    • <group> — execution: takes subcommand + params, forwards to upstream

  5. Forward tool calls directly to the matching upstream server

  6. Generate help dynamically from original tool schemas

Tool interface

help_postgres          ← call with no arguments to discover
postgres               ← call with subcommand: "postgres_query", params: {sql: "..."}

Multi-server aggregation

MCPico can proxy multiple upstream servers simultaneously:

{
  "servers": [
    {
      "name": "filesystem",
      "transport": {
        "type": "stdio",
        "command": "npx",
        "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
      }
    },
    {
      "name": "github",
      "transport": {
        "type": "sse",
        "url": "https://mcp-github.example.com/mcp"
      }
    }
  ]
}

Groups from different servers are merged if they share a prefix. Otherwise each server's tools appear as separate groups.

Configuration

Field

Type

Default

Description

servers

ServerConfig[]

required

Upstream MCP servers to proxy

separator

string

"_"

Separator for prefix-based tool grouping

groups

object

{}

Explicit group overrides ({ "group": ["tool1","tool2"] })

listen

ListenConfig

{"type":"stdio"}

How MCPico exposes itself to MCP clients

ListenConfig

Field

Type

Required

Description

type

"stdio"

yes

Standard stdio transport

type

"sse"

yes

HTTP/SSE — specify port and optional host

// SSE listen mode — MCPico as an HTTP endpoint
{
  "servers": [...],
  "listen": {
    "type": "sse",
    "port": 3000
  }
}

ServerConfig

Field

Type

Required

Description

name

string

yes

Friendly name / group namespace

transport

TransportConfig

yes

How to connect to the upstream server

connectTimeoutMs

number

no

Connection timeout in ms (default: 30000)

TransportConfig (stdio)

Field

Type

Required

Description

type

"stdio"

yes

Transport type

command

string

yes

Executable to spawn

args

string[]

no

Command-line arguments

env

object

no

Environment variables

cwd

string

no

Working directory

TransportConfig (SSE / Streamable HTTP)

Field

Type

Required

Description

type

"sse"

yes

Transport type

url

string

yes

Full URL to MCP Streamable HTTP endpoint

Authentication

MCPico supports two layers of authentication:

Layer 1: Protecting the listen endpoint

When MCPico exposes an SSE endpoint, you can require a bearer token from clients:

{
  "servers": [...],
  "listen": {
    "type": "sse",
    "port": 3000,
    "auth": {
      "type": "bearer",
      "token": "${MCPICO_API_KEY}"
    }
  }
}

Clients must include Authorization: Bearer <token> in requests. Invalid or missing tokens receive a 401 response.

Layer 2: Authenticating to upstream servers

Upstream servers can require authentication. MCPico supports three methods:

Bearer token — standard Authorization: Bearer <token> header:

{
  "servers": [
    {
      "name": "internal-api",
      "transport": {
        "type": "sse",
        "url": "https://api.internal/mcp"
      },
      "auth": {
        "type": "bearer",
        "token": "${INTERNAL_KEY}"
      }
    }
  ]
}

Custom header — arbitrary headers (e.g. X-API-Key):

{
  "auth": {
    "type": "header",
    "name": "X-API-Key",
    "value": "${WIDGET_KEY}"
  }
}

OAuth 2.0 client credentials — machine-to-machine authentication with automatic token refresh:

{
  "auth": {
    "type": "oauth",
    "grant_type": "client_credentials",
    "client_id": "${PROVIDER_CLIENT_ID}",
    "client_secret": "${PROVIDER_CLIENT_SECRET}",
    "token_url": "https://auth.example.com/oauth/token",
    "scopes": ["read", "write"]
  }
}

MCPico handles the full OAuth flow:

  • Fetches initial access token on startup

  • Caches tokens in ~/.mcplico/credentials.json

  • Automatically refreshes before expiry

  • Retries on 401 with fresh tokens

All auth fields support ${ENV_VAR} interpolation — never hardcode secrets.

Auth config reference

Field

Type

Required

Description

auth.type

"bearer" | "header" | "oauth"

yes

Auth method

auth.token

string

for bearer

Bearer token value

auth.name

string

for header

Header name

auth.value

string

for header

Header value

auth.grant_type

"client_credentials"

for oauth

OAuth grant type

auth.client_id

string

for oauth

OAuth client ID

auth.client_secret

string

for oauth

OAuth client secret

auth.token_url

string

for oauth

Token endpoint URL

auth.scopes

string[]

no

OAuth scopes to request

auth.authorization_server_url

string

no

Auth server URL (if different from token_url issuer)

Development

Development

npm install
npm run build    # TypeScript compilation
npm test         # Run tests (138 tests, vitest)
npm run dev      # Run directly with tsx

License

MIT

A
license - permissive license
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    -
    quality
    A
    maintenance
    A proxy server that wraps existing MCP servers to significantly reduce token consumption by compressing tool descriptions into a two-step interface. It enables users to integrate extensive toolsets without exceeding context limits or incurring high API costs.
    Last updated
    97
    Apache 2.0
  • A
    license
    -
    quality
    D
    maintenance
    Reduces LLM context window overhead by proxying multiple MCP servers through a few efficient dispatch tools instead of registering hundreds of individual tool schemas. It supports multi-account routing and tool discovery for both CLI-based and persistent MCP server configurations.
    Last updated
    MIT
  • A
    license
    -
    quality
    A
    maintenance
    Aggregates tools from multiple upstream MCP servers and exposes them through 4 meta-tools, enabling LLMs to discover and use hundreds of tools without loading all schemas upfront.
    Last updated
    2
    Apache 2.0

View all related MCP servers

Related MCP Connectors

  • AI Reasoning Cache & Consensus Layer with 11 MCP tools via Streamable HTTP.

  • Hosted MCP endpoint with realistic fake data for prototyping agents. 12 tools, no setup.

  • Agent-native collaboration network: orchestrate a team of long-running agents from any MCP client.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lxg2it/mcpico'

If you have feedback or need assistance with the MCP directory API, please join our Discord server