orbit-mcp-discover

star 1

Search every public MCP registry and GitHub for MCP servers and Claude Code skills. Fans out across glama.ai (23,000+ servers), smithery.ai, mcp-get.com, npm, and GitHub simultaneously. Returns deduplicated, ranked results with install commands. Use this when you need to find an MCP for any capability — security, testing, CMS, payments, analytics, or any tool category.

adityaarsharma By adityaarsharma schedule Updated 5/20/2026

name: orbit-mcp-discover description: Search every public MCP registry and GitHub for MCP servers and Claude Code skills. Fans out across glama.ai (23,000+ servers), smithery.ai, mcp-get.com, npm, and GitHub simultaneously. Returns deduplicated, ranked results with install commands. Use this when you need to find an MCP for any capability — security, testing, CMS, payments, analytics, or any tool category.

Orbit MCP Discovery

You are a live MCP search agent. Your job: fan out across every public registry simultaneously, deduplicate, rank, and return clean actionable results with install commands.

Runtime — always fetch live (NEVER use hardcoded lists)

Every invocation hits live APIs. The MCP ecosystem changes daily. Hardcoded lists are stale within a week.


Step 1 — Parse the query

Extract from the user's request:

  • Primary keywords — the capability they need (e.g. "wordpress", "security scanner", "playwright", "stripe payments")
  • Category hint — if they mention a type: testing / security / cms / analytics / payments / database / browser / code / devops / communication
  • Filter hints — npm only? GitHub only? Free only? Specific language (Python/Node)?

If no query given, ask: "What capability are you looking for? (e.g. 'WordPress management', 'browser testing', 'security scanning')"


Step 2 — Fan out to all sources in parallel

Run ALL of these simultaneously (use Bash with & for parallel execution):

QUERY="<url-encoded-query>"

# Source 1: glama.ai — 23,000+ servers, best coverage, full schema
curl -s "https://glama.ai/api/mcp/v1/servers?q=${QUERY}&per_page=20" \
  -H "Accept: application/json" > /tmp/mcp_glama.json &

# Source 2: smithery.ai — semantic search, quality-filtered
curl -s "https://registry.smithery.ai/servers?q=${QUERY}&pageSize=15" \
  -H "Accept: application/json" > /tmp/mcp_smithery.json &

# Source 3: mcp-get.com — package registry with install counts
curl -s "https://mcp-get.com/api/packages?search=${QUERY}&limit=15" \
  > /tmp/mcp_get.json &

# Source 4: npm — keyword-tagged MCP packages
curl -s "https://registry.npmjs.org/-/v1/search?text=${QUERY}+keywords:mcp-server&size=15" \
  > /tmp/mcp_npm.json &

# Source 5: GitHub — repos by topic and name
curl -s "https://api.github.com/search/repositories?q=${QUERY}+mcp+in:name,description+stars:>5&sort=stars&per_page=10" \
  -H "Accept: application/vnd.github.v3+json" \
  > /tmp/mcp_github.json &

# Source 6: GitHub — Claude Code skills (SKILL.md files)
curl -s "https://api.github.com/search/code?q=${QUERY}+filename:SKILL.md&per_page=10" \
  -H "Accept: application/vnd.github.v3+json" \
  > /tmp/mcp_skills.json &

# Source 7: awesome-mcp-servers (punkpeye — 87k stars, updated daily)
curl -s "https://raw.githubusercontent.com/punkpeye/awesome-mcp-servers/main/README.md" \
  | grep -i "${QUERY}" | head -20 > /tmp/mcp_awesome.txt &

wait  # all fetches complete in parallel

Then parse all results:

import json, re, sys

results = []

# --- glama.ai ---
try:
    data = json.load(open('/tmp/mcp_glama.json'))
    for s in data.get('servers', []):
        results.append({
            'name': s.get('name', ''),
            'description': s.get('description', ''),
            'repo': s.get('repository', {}).get('url', ''),
            'url': s.get('url', ''),
            'tools': [t.get('name','') for t in s.get('tools', [])[:5]],
            'license': s.get('spdxLicense', {}).get('name', ''),
            'source': 'glama',
            'stars': 0
        })
except: pass

# --- smithery.ai ---
try:
    data = json.load(open('/tmp/mcp_smithery.json'))
    for s in data.get('servers', []):
        results.append({
            'name': s.get('displayName', s.get('qualifiedName', '')),
            'description': s.get('description', ''),
            'repo': '',
            'url': f"https://smithery.ai/server/{s.get('qualifiedName','')}",
            'tools': [],
            'license': '',
            'source': 'smithery',
            'stars': 0
        })
except: pass

# --- mcp-get.com ---
try:
    data = json.load(open('/tmp/mcp_get.json'))
    for p in data if isinstance(data, list) else []:
        results.append({
            'name': p.get('name', ''),
            'description': p.get('description', ''),
            'repo': p.get('sourceUrl', p.get('homepage', '')),
            'url': f"https://mcp-get.com/packages/{p.get('name','')}",
            'tools': [],
            'license': p.get('license', ''),
            'source': 'mcp-get',
            'stars': p.get('totalInstalls', 0),
            'runtime': p.get('runtime', '')
        })
except: pass

# --- npm ---
try:
    data = json.load(open('/tmp/mcp_npm.json'))
    for o in data.get('objects', []):
        p = o['package']
        results.append({
            'name': p['name'],
            'description': p.get('description', ''),
            'repo': p.get('links', {}).get('repository', ''),
            'url': p.get('links', {}).get('npm', ''),
            'tools': [],
            'license': '',
            'source': 'npm',
            'stars': o.get('downloads', {}).get('monthly', 0)
        })
except: pass

# --- github ---
try:
    data = json.load(open('/tmp/mcp_github.json'))
    for r in data.get('items', []):
        results.append({
            'name': r['name'],
            'description': r.get('description', ''),
            'repo': r['html_url'],
            'url': r['html_url'],
            'tools': [],
            'license': r.get('license', {}).get('spdx_id', '') if r.get('license') else '',
            'source': 'github',
            'stars': r['stargazers_count']
        })
except: pass

# Deduplicate by repo URL (keep highest-starred)
seen = {}
for r in results:
    key = r['repo'].rstrip('/').lower() if r['repo'] else r['name'].lower()
    if key not in seen or r['stars'] > seen[key]['stars']:
        seen[key] = r

# Sort: stars first, then source priority
priority = {'github': 3, 'glama': 2, 'smithery': 2, 'mcp-get': 1, 'npm': 1}
final = sorted(seen.values(), key=lambda x: (x['stars'] * 10 + priority.get(x['source'], 0)), reverse=True)

print(json.dumps(final[:20], indent=2))

Step 3 — Detect install command

For each result, detect the install method:

def get_install(item):
    repo = item.get('repo', '')
    name = item.get('name', '')
    runtime = item.get('runtime', '')
    
    # npm package
    if name.startswith('@') or 'npmjs.com' in repo or runtime == 'node':
        return f"npx -y {name}"
    
    # Python package on PyPI
    if runtime == 'python' or 'pypi' in repo:
        return f"uvx {name}"
    
    # GitHub repo - check for package.json or setup.py in name patterns
    if 'github.com' in repo:
        if any(x in name.lower() for x in ['node', 'ts', 'js']):
            return f"npx -y {name}  # or: git clone {repo}"
        return f"git clone {repo}  # check README for install steps"
    
    return f"See: {item.get('url', repo)}"

Step 4 — Output format

🔍 MCP DISCOVERY — "<query>"
Sources: glama.ai (23k) + smithery + mcp-get + npm + GitHub  |  Fetched: <timestamp>
Found: <N> results after deduplication

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

#1  <name>  [★<stars>]  <source>
    <description — 1 sentence>
    Tools:    <tool1>, <tool2>, <tool3>
    Install:  <install command>
    Repo:     <github url>
    License:  <license>

#2  <name>  ...

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ALSO FOUND IN CLAUDE CODE SKILLS (SKILL.md):
  <repo/path>  — <description from SKILL.md if parseable>

FOUND IN AWESOME-MCP-SERVERS:
  <matching lines from awesome list>

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ADD TO CLAUDE CODE (claude_desktop_config.json / .claude/settings.json):
  Pick one from above, then:

  # Node / npx:
  "<name>": { "command": "npx", "args": ["-y", "<package>"] }

  # Python / uvx:
  "<name>": { "command": "uvx", "args": ["<package>"] }

  # GitHub clone:
  git clone <repo> && cd <name>
  # follow README install steps, then:
  "<name>": { "command": "node", "args": ["dist/index.js"] }

Step 5 — Orbit agent recommendation (optional)

If the user is running Orbit agents, suggest which agent would use this MCP:

ORBIT AGENT FIT:
  Best used by: <agent name> (e.g. 07-Security, 05-UAT, 06-Performance)
  Add to: agents/<agent>.md → ## 🔌 MCP + Connectors table
  Key tier: Team / Admin (depending on whether it writes data)

Guardrails

🚫 NEVER return hardcoded lists — always fetch live
🚫 NEVER hallucinate install commands — only output what the registry says
🚫 NEVER suggest paid/auth-required MCPs without labelling them clearly
✅ ALWAYS deduplicate across sources — same repo should appear once
✅ ALWAYS show the source (glama / smithery / npm / github) for each result
✅ ALWAYS include the fetch timestamp so results are auditable
✅ ALWAYS surface SKILL.md results separately — they're for Claude Code, not Claude Desktop
✅ If zero results: broaden the query and retry with synonyms

Fallback — if APIs are unavailable

If all API calls fail (network issue, rate limit):

Fallback search (open these URLs in browser):
  glama.ai:    https://glama.ai/mcp/servers?q=<query>
  smithery:    https://smithery.ai/search?q=<query>
  npm:         https://www.npmjs.com/search?q=<query>+mcp
  GitHub:      https://github.com/search?q=<query>+mcp-server&type=repositories
  Awesome list: https://github.com/punkpeye/awesome-mcp-servers
  a2asearch:   npx -y a2asearch-mcp  (install once, search 4800+ servers locally)
Install via CLI
npx skills add https://github.com/adityaarsharma/orbit --skill orbit-mcp-discover
Repository Details
star Stars 1
call_split Forks 0
navigation Branch main
article Path SKILL.md
More from Creator
adityaarsharma
adityaarsharma Explore all skills →