Skip to content
Code Guide

MCP Servers Ecosystem

Last updated: May 2026 • Next review: June 2026

This guide covers validated community MCP servers beyond the official Anthropic servers. All servers listed have been evaluated for production readiness, maintenance activity, and security.

Not sure whether to use an MCP server or a CLI tool? See the MCP vs CLI Decision Guide for a full breakdown of tradeoffs, a decision matrix, and guidance by situation.


TypeExamplesCharacteristicsUse When
Officialfilesystem, memory, brave-search, githubAnthropic-maintained, guaranteed stabilityDefault choice, core functionality
CommunityPlaywright, Semgrep, KubernetesMaintained by orgs/individuals, can be production-readySpecialized needs, ecosystem integration

Key difference: Official servers have Anthropic SLA backing, community servers require individual evaluation.


All community servers are evaluated against these criteria:

CriterionThresholdJustification
GitHub Stars≥50Minimum community validation
Recent Release<3 monthsActive maintenance
DocumentationREADME + examples + configReduces adoption friction
Tests/CI✅ AutomatedEnsures stability
Use CaseNot covered by official serversAvoids redundancy
LicenseOSS requiredSustainability and auditability

Quality Score Components:

  • Maintenance (10 points): Release frequency, issue response time
  • Documentation (10 points): README completeness, examples, troubleshooting
  • Tests (10 points): Test coverage, CI/CD automation
  • Performance (10 points): Response time, resource efficiency
  • Adoption (10 points): Community usage, production deployments

Total Score: /50 → Normalized to /10 for final rating.


Major developments (January 2026):

MCP becomes official standard via Agentic AI Foundation under Linux Foundation governance.

Anthropic deploys optimizations for MCP context management:

  • Deferred loading: Tools loaded on-demand, not upfront
  • Search-based tools: Efficient tool discovery in large sets
  • Announcement: Josh Twist LinkedIn

Standardized bundle format for one-click MCP server installation (replaces runtime dependency management).

Claude now supports interactive tools via MCP Apps spec:

Visual Studio 2026 natively integrates Azure MCP Server, GitHub Copilot Chat, and MCP clients.


These foundational MCP servers provide version control automation for all development workflows. Official Anthropic servers with guaranteed stability.

Official Anthropic server for Git repository interaction via Model Context Protocol. Provides programmatic access to Git operations with structured output and cross-platform safety.

Repository: modelcontextprotocol/servers/git License: MIT Status: Early development (API subject to change) Stars: 77,908+ (parent repo)

Use Cases:

  • Automated commit workflows: AI generates commit messages, stages changes, commits
  • Log analysis: Filter commits by date, author, branch with structured output
  • Branch management: Create feature branches, checkout, filter by SHA
  • Token-efficient diffs: Control context lines for focused code reviews
  • Multi-repo automation: Manage multiple repositories in monorepo setups
ToolDescriptionParameters
git_statusWorking tree status (staged, unstaged, untracked)-
git_logCommit history with advanced filteringmax_count, skip, start_timestamp, end_timestamp, author
git_diffDiff between commits/branchestarget, source, context_lines
git_diff_unstagedUnstaged changescontext_lines
git_diff_stagedStaged changescontext_lines
git_commitCreate commitmessage
git_addStage files/patternsfiles
git_resetUnstage filesfiles
git_branchList/filter branchescontains, not_contains
git_create_branchCreate new branchname
git_checkoutSwitch branches/commitsref
git_showShow commit detailsrevision

Advanced Filtering (git_log):

  • ISO 8601 dates: 2024-01-15T14:30:25
  • Relative dates: 2 weeks ago, yesterday, last month
  • Absolute dates: 2024-01-15, Jan 15 2024
  • Author filtering: --author="John Doe"

Installation (3 methods):

Terminal window
# Method 1: UV (recommended) - one-liner
uvx mcp-server-git --repository /path/to/repo
# Method 2: pip + Python module
pip install mcp-server-git
python -m mcp_server_git
# Method 3: Docker (sandboxed)
docker run -v /path/to/repo:/repo ghcr.io/modelcontextprotocol/mcp-server-git

Claude Code Configuration (~/.claude.json):

{
"mcpServers": {
"git": {
"command": "uvx",
"args": ["mcp-server-git", "--repository", "/Users/you/projects/myrepo"]
}
}
}

Multi-repo support:

{
"mcpServers": {
"git-main": {
"command": "uvx",
"args": ["mcp-server-git", "--repository", "/path/to/main-repo"]
},
"git-docs": {
"command": "uvx",
"args": ["mcp-server-git", "--repository", "/path/to/docs-repo"]
}
}
}

One-click install buttons available for:

  • Claude Desktop (macOS/Windows/Linux)
  • VS Code (Stable + Insiders)
  • Zed
  • Zencoder

See official README for integration links.

8.5/10 ⭐⭐⭐⭐⭐

CriterionScoreNotes
Maintenance10/10Anthropic-backed, active development
Documentation9/10Comprehensive README, examples, but early dev warnings
Tests8/10Automated CI, improving coverage
Performance8/10Fast (<100ms), structured output reduces tokens
Adoption8/10Official server, 77K+ stars, wide IDE support
LimitationWorkaround
Early development (API changes)Pin version in production, monitor releases
No interactive rebase (-i flag)Use Bash tool for git rebase -i
No reflog supportUse Bash tool for git reflog
No git bisectUse Bash tool for git bisect
Single repo per instanceConfigure multiple MCP server instances

Decision Matrix: Git MCP vs GitHub MCP vs Bash Tool

Section titled “Decision Matrix: Git MCP vs GitHub MCP vs Bash Tool”

When to use which tool:

OperationGit MCPGitHub MCPBash ToolJustification
Local commits✅ Best⚠️ OKStructured output, cross-platform safe
Branch management✅ Best⚠️ OKgit_branch filtering, SHA contains/excludes
Diff/log analysis✅ Best⚠️ OKcontext_lines control, token-efficient
Staging files✅ Best⚠️ OKPattern matching (git_add), safer
PR creation✅ Best⚠️ gh CLIGitHub API, labels, assignees, reviewers
Issue management✅ Best⚠️ gh CLIGitHub-specific operations
CI/CD status checks✅ Best⚠️ gh CLIGitHub Actions integration
Interactive rebase✅ BestGit MCP doesn’t support -i flag
Reflog recovery✅ BestAdvanced Git operations
Git bisect debugging✅ BestComplex debugging workflows
Multi-tool pipelinesMCP servers compose with other MCP tools

Decision Tree:

Is it a GitHub-specific operation (PRs, Issues, Actions)?
├─ YES → Use GitHub MCP
└─ NO → Is it a core Git operation (commit, branch, diff, log)?
├─ YES → Use Git MCP (structured, safe, token-efficient)
└─ NO → Is it an advanced Git feature (rebase -i, reflog, bisect)?
├─ YES → Use Bash tool (flexibility)
└─ NO → Default to Git MCP (safer, structured)

Workflow Examples:

WorkflowTool ChainJustification
Feature developmentGit MCP (git_create_branch + git_commit) → GitHub MCP (PR)Atomic, structured, full lifecycle
Commit history analysisGit MCP (git_log with start_timestamp: "2 weeks ago")Token-efficient filtering, relative dates
Code review preparationGit MCP (git_diff with context_lines: 3)Focused context, reduced tokens
Clean up commits (rebase)Bash tool (git rebase -i HEAD~5)Interactive mode not in Git MCP
Recover lost commitsBash tool (git reflog)Reflog not exposed in Git MCP
Bug hunting with bisectBash tool (git bisect start/good/bad)Bisect workflow not in Git MCP
Automated release flowGit MCP (commit + tag) → GitHub MCP (create release)Full automation, structured

Official Microsoft server for browser automation optimized for LLMs. Uses accessibility trees instead of screenshots, reducing token usage.

Use Case: AI coding agents verify their work in browsers (E2E testing, bug verification).

Key Features:

CapabilityDetails
Browser AutomationNavigate, click, fill, hover (Playwright API)
Content ExtractionStructured data via accessibility trees
ScreenshotsFull-page + element-specific
JavaScript ExecutionRun code in page context
Session ManagementPersistent browser state
Supported BrowsersChromium, Firefox, WebKit

Setup:

Terminal window
# Installation
npm install @microsoft/playwright-mcp
# or
npx @microsoft/playwright-mcp

Claude Code Configuration (~/.claude.json):

{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["--yes", "@microsoft/playwright-mcp"]
}
}
}

Example Usage:

User: "Navigate to example.com, log in with email test@example.com, then take a screenshot"
Claude: [Uses playwright_navigate → playwright_type → playwright_click → playwright_screenshot]
Result: Screenshot + accessibility tree in context

Quality Score: 8.8/10 ⭐⭐⭐⭐⭐

DimensionScoreNotes
Maintenance9/10Bi-weekly releases, active Microsoft team
Documentation9/10README complete, examples, Playwright Live videos
Tests10/10Extensive test suite, CI/CD automated
Performance8/10Fast snapshots (~200ms), memory-efficient
Adoption8/102890+ uses (Smithery.ai tracking)

Limitations & Workarounds:

LimitationWorkaround
Single browser sessionUse session ID to persist state
No cross-domain iframe accessRestrict to same-origin content
Screenshot size limits (4K max)Use element snapshots for large pages

Alternatives:

ServerAdvantageDisadvantage
Playwright MCPAccessibility trees, LLM-nativeNo vision model support
Browserbase MCPCloud-based, stealth modeAPI costs, latency
Puppeteer MCPLightweight, JS-onlyLess structured data

Resources:


Official Browserbase server for cloud browser automation. Includes Stagehand AI agent for autonomous task execution.

Use Case: Complex web interactions requiring stealth mode, proxy support, or autonomous execution (web scraping, form filling, data extraction).

Key Features:

CapabilityDetails
Browser ControlChromium via Browserbase cloud
Stagehand AgentAutonomous task execution (e.g., “book a flight”)
Data ExtractionCSS selectors + schema-based structured extraction
Anti-DetectionStealth mode, proxy support, rotation
Multi-ModelOpenAI, Claude, Gemini, custom LLM

Setup:

Terminal window
npm install @browserbasehq/mcp-server-browserbase

Configuration:

{
"mcpServers": {
"browserbase": {
"command": "npx",
"args": ["@browserbasehq/mcp-server-browserbase"],
"env": {
"BROWSERBASE_API_KEY": "YOUR_KEY",
"BROWSERBASE_PROJECT_ID": "YOUR_PROJECT_ID",
"GEMINI_API_KEY": "YOUR_GEMINI_KEY"
}
}
}
}

Quality Score: 7.6/10 ⭐⭐⭐⭐

Cost: Freemium (paid API usage), ~$0.10/session

Limitations:

LimitationWorkaround
Latency (~500ms cloud)Batch operations, cache results
API costsUse for high-value extractions only
Stagehand limitationsFall back to manual playwright_* tools

Resources:


Official Anthropic server for Chrome DevTools Protocol integration. Provides debugging and inspection capabilities via Chrome’s native DevTools APIs.

Use Case: Debugging web applications, inspecting runtime state, monitoring network requests, and analyzing performance. Complements Playwright MCP (testing) with development-focused debugging capabilities.

Key Features:

CapabilityDetails
Console AccessRead browser console logs, errors, warnings
Network MonitorInspect HTTP requests, responses, headers
DOM InspectionQuery DOM structure, element properties
JavaScript ExecutionExecute arbitrary JS in page context
Performance ProfilingCPU profiles, memory snapshots

Setup:

Terminal window
npm install @modelcontextprotocol/server-chrome-devtools

Configuration:

{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": ["@modelcontextprotocol/server-chrome-devtools"]
}
}
}

When to Use:

ScenarioUse Chrome DevTools MCPUse Playwright MCP
Debug runtime errors✅ Console logs, stack traces❌ Limited error visibility
Inspect network calls✅ Full request/response details⚠️ Basic navigation only
Test user interactions❌ Not designed for testing✅ Click, type, navigate
Profile performance✅ CPU/memory profiling❌ No profiling tools
Automate workflows❌ Manual debugging focus✅ E2E test automation

Limitations:

  • Requires Chrome browser running with DevTools Protocol enabled
  • Manual setup (launch Chrome with --remote-debugging-port)
  • Not suitable for automated testing (use Playwright for that)
  • Performance overhead when profiling enabled

Resources:


Official Containers Community server (Red Hat-backed) for Kubernetes/OpenShift management in natural language.

Use Case: DevOps/SRE uses Claude to query/configure cluster (“kubectl in natural language”).

Key Features:

CapabilityDetails
Resource CRUDCreate, Read, Update, Delete any K8s resource
Pod OperationsLogs, events, exec, metrics (top)
Deployment ManagementScale, rollout, status
Config ManagementView/update ConfigMaps, Secrets
CRD SupportCustom Resource Definitions
Multi-ClusterSwitch kubeconfig contexts
OpenShift SupportNative OpenShift resources

Setup:

Terminal window
# Docker
docker run -it --rm \
--mount type=bind,src=$HOME/.kube/config,dst=/home/mcp/.kube/config \
ghcr.io/containers/kubernetes-mcp-server
# Native (Go binary)
go install github.com/containers/kubernetes-mcp-server@latest
kubernetes-mcp-server

Claude Desktop Configuration:

{
"mcpServers": {
"kubernetes": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--mount",
"type=bind,src=/home/user/.kube/config,dst=/home/mcp/.kube/config",
"ghcr.io/containers/kubernetes-mcp-server"
]
}
}
}

Example Usage:

User: "Show me all pods in production namespace with memory usage >500Mi"
Claude: [Uses list_resources for pods + metrics]
Result: List of pods with memory stats
User: "Scale the backend deployment to 5 replicas"
Claude: [Uses patch_resource]
Result: Deployment scaled

Quality Score: 8.4/10 ⭐⭐⭐⭐

Security: RBAC enforcement, kubeconfig auth, no privilege escalation

Limitations:

LimitationWorkaround
Requires kubeconfig accessUse ServiceAccount + RBAC for safety
Limited node shell accessUse kubectl exec for debugging
CRD discovery lagPre-document CRDs for AI context

Resources:


Community server for Vercel platform (deployments, projects, env vars, teams).

Use Case: AI assistant generates Next.js code, creates Vercel project, configures env vars, triggers deployment — full CI/CD loop without leaving IDE.

Key Features:

CapabilityDetails
DeploymentsList, get details, create, monitor status
ProjectsList, create, update settings
Environment VariablesGet, set, manage secrets
TeamsList, create, manage
DomainsList, configure, DNS management
FunctionsMonitor Vercel Functions, logs

Setup:

Terminal window
git clone https://github.com/nganiet/mcp-vercel
cd vercel-mcp
npm install

Configuration:

{
"mcpServers": {
"vercel": {
"command": "npm",
"args": ["start"],
"env": {
"VERCEL_API_TOKEN": "YOUR_VERCEL_TOKEN"
}
}
}
}

Quality Score: 7.6/10 ⭐⭐⭐⭐

Note: Vercel also has an official MCP server. This community version offers comprehensive API coverage.

Resources:

Official Sentry server for error monitoring and observability. Closes the diagnostic loop: Sentry alert fires → Claude reads issue + stack trace → diagnoses root cause → proposes or writes the patch.

Repository: getsentry/sentry-mcp License: MIT Maintainer: Sentry (official)

Use Case: A Sentry alert fires in prod. The engineer asks Claude: “What’s causing SEN-4521?”. Claude reads the full stack trace, traces the regression through the codebase, and drafts a fix — without leaving the IDE. The observability loop closes inside Claude Code.

Key Features:

ToolDescription
list_issuesFetch unresolved issues with Sentry query syntax (is:unresolved level:error)
get_issueFull issue details — stack trace, affected users, first/last seen timestamps
get_eventSpecific event by ID, useful for time-scoped investigations
search_eventsFull-text search across raw events with field filters
list_projectsList projects in your Sentry organization

Setup:

Terminal window
# Via npx (recommended — verify package name against official docs)
npx -y @sentry/mcp-server
# One-liner for Claude Code
claude mcp add sentry -- npx -y @sentry/mcp-server

Claude Code Configuration (~/.claude/settings.json):

{
"mcpServers": {
"sentry": {
"command": "npx",
"args": ["-y", "@sentry/mcp-server"],
"env": {
"SENTRY_AUTH_TOKEN": "your_auth_token",
"SENTRY_ORG": "your-org-slug"
}
}
}
}

Auth token: sentry.io/settings/account/api/auth-tokens/ — scopes needed: project:read, event:read, org:read

Example Usage:

User: "What's causing SEN-4521? It's been firing since yesterday's deploy."
Claude:
[list_issues: query="is:unresolved level:error project:api-service"]
[get_issue: issue_id="4521"]
Result: NullPointerException in UserController.getProfile() at line 142.
Introduced in commit a3f8c2 (yesterday 14:32 UTC) — null check removed
in the profile refactor. Fix: restore Optional.ofNullable at line 142.
Opening a PR now.

Query Syntax (critical for effective use — the most common source of call failures):

is:unresolved # unresolved issues only
is:unresolved level:error # errors only (excludes warnings, info)
is:unresolved has:user # issues with identified users
is:unresolved times_seen:>100 # high-frequency issues
project:api-service is:unresolved # scope to one project
assigned:me is:unresolved # issues assigned to you
!has:assignee is:unresolved # unassigned issues

Reference file: examples/skills/mcp-integration-reference/references/sentry-mcp.md in this repo — complete parameter docs, gotchas, pagination patterns, and a curated noise-exclusion list. Copy it to your CLAUDE.md includes or project skills.

Quality Score: 8.5/10 ⭐⭐⭐⭐⭐

DimensionScoreNotes
Maintenance10/10Official Sentry server, enterprise-backed
Documentation8/10Good README + Sentry docs cover edge cases
Tests8/10CI present, TypeScript type safety
Performance8/10API-bound (~200–400ms), pagination required for large orgs
Adoption9/10Sentry is the de facto error monitoring standard (100K+ organizations)

Limitations & Workarounds:

LimitationWorkaround
organization_slug ≠ display nameRead slug from URL: sentry.io/organizations/<slug>/
search_events times out in large orgsAlways scope with project_slug when searching events
100 issues max per callUse cursor-based pagination for complete sweeps
Read-only by defaultResolve/assign operations need additional token scopes
90-day event retentionEvents older than 90 days unavailable on default Sentry plan

When to Use vs Alternatives:

ToolBest ForNot Worth It When
Sentry MCPError diagnosis loop: alert → stack trace → patchPure alerting (use webhooks or PagerDuty directly)
Datadog MCPAPM, distributed traces, metrics dashboardsError-only workflows — overengineered for that use case
Bash + Sentry CLIBulk operations, scripted data exportsInteractive debugging sessions

Resources:


Official Semgrep server for vulnerability scanning (SAST, secrets, supply chain). Includes custom rules engine.

Use Case: Claude Code generates code, Semgrep automatically scans for security issues, proposes fixes (“secure by default”).

Key Features:

CapabilityDetails
Quick ScanFast security check on code snippet
Full ScanComprehensive SAST using p/ci ruleset
Custom RulesScan with user-provided Semgrep rules
AST GenerationAbstract Syntax Tree for analysis
Ruleset SupportPre-built rulesets (OWASP, CWE, etc.)
Language CoveragePython, JS/TS, Java, Go, C#, Rust, PHP, etc.

Setup:

Terminal window
# Via uvx (recommended)
uvx semgrep-mcp
# Or pip
pip install semgrep-mcp

Claude Code Configuration:

Terminal window
claude mcp add semgrep -- uvx semgrep-mcp

Cursor Configuration (~/.cursor/mcp.json):

{
"mcpServers": {
"semgrep": {
"command": "uvx",
"args": ["semgrep-mcp"],
"env": {
"SEMGREP_APP_TOKEN": "your_token"
}
}
}
}

Example Usage:

User: "Scan this Python code for SQL injection vulnerabilities"
Code:
def search(query):
return db.execute(f"SELECT * FROM users WHERE name = '{query}'")
Claude: [Uses security_check tool]
Result: [VULNERABLE] SQL injection detected at line 2.
Fix: Use parameterized queries:
return db.execute("SELECT * FROM users WHERE name = ?", [query])

Quality Score: 9.0/10 ⭐⭐⭐⭐⭐

DimensionScoreNotes
Maintenance10/10Official, frequent releases
Documentation9/10Comprehensive docs, examples
Tests10/10Extensive test coverage
Performance7/10Good, complexity-dependent (~500ms per scan)
Adoption9/10Enterprise standard (5000+ companies)

Alternatives:

ServerAdvantageDisadvantage
SemgrepComprehensive SAST, custom rulesSlower on large codebases
GitGuardianSecrets-focused, fastLimited SAST coverage
SonarQubeEnterprise, detailed reportsHeavier, more setup

Resources:


Community server for semantic code search and call graph analysis via local Ollama embeddings. Searches code by intent (“payment flow”, “auth logic”) instead of exact patterns, and traces function call relationships.

Repository: yoanbernabeu/grepai License: MIT Status: Active development Privacy: Fully local (Ollama + nomic-embed-text), no data leaves your machine

Use Case: Developer needs to understand unfamiliar codebase → grepai finds relevant code by natural language description and maps function dependencies, without reading entire files.

Key Features:

CapabilityDetails
grepai_searchSemantic search by natural language query (e.g., “error handling middleware”)
grepai_trace_callersFind all functions that call a given symbol
grepai_trace_calleesFind all functions called by a given symbol
grepai_trace_graphFull call graph (callers + callees) with configurable depth
grepai_index_statusHealth check: indexed files, chunks, configuration

Token Efficiency:

WorkflowTokensVerdict
Grep + Read files (brute force)~15KNoisy, lots of irrelevant context
grepai search + trace~4KTargeted, relevant results only
grepai alone (no follow-up)~2-3KFast discovery

Setup:

Terminal window
# Install grepai
curl -sSL https://raw.githubusercontent.com/yoanbernabeu/grepai/main/install.sh | sh
# Install Ollama + embedding model
brew install ollama
ollama pull nomic-embed-text
# Initialize in your project
cd /path/to/project
grepai init # Choose: ollama, nomic-embed-text, gob
# Index your codebase
grepai index
# Optional: watch for file changes (auto-reindex)
grepai watch

Claude Code Configuration:

Terminal window
claude mcp add grepai -- grepai mcp

.mcp.json (project-scoped):

{
"mcpServers": {
"grepai": {
"command": "grepai",
"args": ["mcp"]
}
}
}

Example Usage:

User: "Find the authentication flow in this codebase"
Claude: [Uses grepai_search query="authentication flow" limit=5]
Result: 3 relevant files with line numbers and similarity scores
- src/auth/middleware.ts:12-45 (0.89)
- src/routes/login.ts:8-32 (0.85)
- src/utils/jwt.ts:1-28 (0.78)
User: "What calls the validateToken function?"
Claude: [Uses grepai_trace_callers symbol="validateToken"]
Result: Call graph showing 4 callers across 3 files
- authMiddleware → validateToken
- refreshHandler → validateToken
- wsAuthGuard → validateToken
- testHelper → validateToken

Quality Score: 7.8/10 ⭐⭐⭐⭐

DimensionScoreNotes
Maintenance8/10Active development, responsive maintainer
Documentation7/10Good README, MCP integration docs
Tests7/10CI present, growing coverage
Performance8/10Fast local embeddings (~2s search), no network latency
Adoption9/10Growing community, production use in Claude Code setups

Limitations & Workarounds:

LimitationWorkaround
Requires Ollama running locallybrew services start ollama (auto-start)
Index can become staleUse grepai watch for auto-reindex
Not ideal for exact pattern matchingUse native Grep tool for regex patterns
Embedding model download (~270MB)One-time ollama pull nomic-embed-text

Alternatives:

ServerAdvantageDisadvantage
GrepaiLocal, private, semantic + call graphsRequires Ollama setup
Native GrepInstant, exact patternsNo semantic understanding
GitHub Code SearchCloud-based, cross-repoRequires GitHub, no call graphs

Cross-reference: See ultimate-guide.md — MCP Servers: Grepai for detailed usage patterns, prompt strategies, and integration with other MCP servers.

Resources:


Official Upstash server for real-time library documentation (LangChain, Anthropic SDK, etc.). Eliminates API hallucination.

Use Case: Claude Code needs to use a library API → Context7 provides up-to-date docs + examples.

Key Features:

CapabilityDetails
Library SearchFind docs for 500+ libraries
Code ExamplesLanguage-specific examples (Python, TS, etc.)
API ReferenceDetailed function signatures, parameters
Version FilteringDocs for specific library versions
Smart RankingAI-ranked by relevance + project usage

Setup:

Terminal window
# Local
npx -y @upstash/context7-mcp --api-key YOUR_API_KEY

Claude Code Configuration (local):

Terminal window
claude mcp add context7 -- npx -y @upstash/context7-mcp --api-key YOUR_API_KEY

Claude Code Configuration (remote/HTTP):

Terminal window
claude mcp add --transport http --header "CONTEXT7_API_KEY: YOUR_API_KEY" \
context7 https://mcp.context7.com/mcp

Example Usage:

User: "Show me how to use Claude's streaming API with the Python SDK"
Claude: [Uses context7 search]
Result: Official Python SDK docs + example code for streaming

Quality Score: 8.2/10 ⭐⭐⭐⭐

Limitations:

LimitationWorkaround
Limited library coverageFallback to web search for obscure libs
Version lag (1-2 days)Use official repo for cutting-edge
Hallucination risk (low but exists)Cross-verify with official docs

Alternatives:

ServerAdvantageDisadvantage
Context7Real-time, version-specificAPI key required
Web SearchComprehensive, freeSlow, hallucination risk
Static RAGFast, localOutdated, no versions

Resources:

ctx7 CLI companion: Context7 also ships a CLI (npx ctx7) that handles skill discovery and MCP setup from the terminal. ctx7 skills suggest auto-detects project dependencies and recommends matching skills; ctx7 setup --claude runs a wizard that configures MCP or CLI+Skills mode automatically. See §5.5 of the ultimate guide for the full workflow.


Community server for Linear (project management SaaS). GraphQL API with issue management, projects, teams, comments.

Use Case: Claude Code automatically creates tickets, updates status, links issues in Linear (closes loop between development and project management).

Key Features:

CapabilityDetails
Issue ManagementList, get, create, update, delete, search
ProjectsList, create, update, assign
Teams & UsersTeam management, member assignment
CommentsAdd, list, with position tracking
CyclesSprint/cycle management
WebhooksSubscribe to Linear events (optional)

Setup:

Terminal window
# NPM or uvx
npm install mcp-linear
# or
uvx mcp-linear

Claude Code Configuration:

Terminal window
claude mcp add linear -- npx -y mcp-linear --api-key YOUR_LINEAR_API_KEY

Example Usage:

User: "Create a bug ticket in Linear for the CSS layout issue I just found"
Claude: [Uses linear.issues.create with team key, title, description]
Result: Ticket created, issue ID returned
User: "Update ticket SOFT-123 status to 'In Progress'"
Claude: [Uses linear.issues.update]
Result: Status changed

Quality Score: 7.6/10 ⭐⭐⭐⭐

Note: Community-maintained (not Linear Inc.), but active and well-documented.

Limitations:

LimitationWorkaround
Timeout issues (fixed after 1h)Implement heartbeat, firewall checks
65KB field limitAuto-chunking for comments
GraphQL complexitySplit complex queries automatically

Alternatives:

ServerAdvantageDisadvantage
Linear MCPModern GraphQL, startup-friendlyCommunity-maintained
Jira MCPEnterprise, complex workflowsHeavier, older API
GitHub IssuesBuilt-in, freeLimited project management

Resources:


Community tool for managing multiple MCP servers Docker Compose-style. Declarative YAML configuration, multi-transport support (STDIO/HTTP/SSE).

Use Case: Developer needs 5+ MCP servers; Docker Compose-like config simplifies lifecycle management.

Key Features:

CapabilityDetails
YAML ConfigurationDocker Compose-style server definitions
Multi-TransportSTDIO, HTTP, SSE, TCP support
Container RuntimesDocker, Podman, native processes
Network ManagementAutomatic Docker network creation
Health MonitoringConnection pooling, session management
HTTP ProxySingle unified HTTP endpoint
Hot ReloadUpdate config without restart

Setup:

Terminal window
git clone https://github.com/phildougherty/mcp-compose
cd mcp-compose
cargo build --release

Configuration (mcp-compose.yaml):

version: "1.0"
mcpServers:
filesystem:
command: npx
args:
- "@modelcontextprotocol/server-filesystem"
- "/tmp"
transport: stdio
memory:
command: npx
args:
- "@modelcontextprotocol/server-memory"
transport: stdio
env:
DEBUG: "true"
postgres:
image: postgres:15
transport: tcp
port: 5432
env:
POSTGRES_PASSWORD: secret
proxy:
port: 3000
listen: "127.0.0.1"

Generate Claude Desktop Config:

Terminal window
./mcp-compose create-config --type claude --output ~/.claude.json

Start Servers:

Terminal window
./mcp-compose up
# Single unified HTTP proxy at http://localhost:3000

Quality Score: 7.4/10 ⭐⭐⭐⭐

Limitations:

LimitationWorkaround
Cargo build requiredUse pre-built binary (if available)
YAML learning curveProvide templates for common setups
Debug complexityUse mcp-compose logs for troubleshooting

Resources:


Community tool for distributing engineering standards as AI context across multiple agents and repositories. Exposes an MCP server for creating and managing playbook standards directly from Claude Code (or any MCP-capable agent).

Use Case: Engineering team maintains one playbook; Packmind MCP server lets Claude Code propose new standards or update existing ones during a session without leaving the editor.

Key Features:

CapabilityDetails
Standards CreationCreate/update playbook entries via MCP tools
Multi-Agent OutputGenerates CLAUDE.md, .cursor/rules, Copilot instructions from one source
Knowledge IngestionPull context from GitHub, Slack, Jira, GitLab, Confluence, Notion via their MCP servers
Self-hostedDocker/Kubernetes, Apache-2.0 CLI

Resources:

Cross-ref: Full tool evaluation in third-party-tools.md — Engineering Standards Distribution.


  • API keys stored in .env, not in config files
  • RBAC/permissions reviewed (especially Kubernetes, Semgrep)
  • Rate limits understood (Linear GraphQL complexity, Vercel API)
  • Fallback mechanisms for API downtime implemented
  • Monitoring + logging enabled for all MCP servers

MCP tools can fail for many reasons, and how you signal those failures to Claude matters. The protocol provides a dedicated mechanism: the isError flag in tool responses.

The isError flag

When a tool call fails, set isError: true in the response instead of raising an exception or returning a fake success. This tells Claude the call failed and invites it to decide what to do next: retry, try a different approach, or surface the issue to the user.

{
"content": [
{
"type": "text",
"text": "Database connection refused: ECONNREFUSED 127.0.0.1:5432"
}
],
"isError": true
}

Without isError: true, Claude may interpret the error message as data and continue confidently with a broken state. With it, Claude understands the step failed and can reason about recovery.

Error taxonomy: four categories

Different failure types warrant different recovery strategies. Structuring your error messages around these four categories makes it easier for Claude to pick the right recovery action:

CategoryWhenClaude’s expected responseExample
TransientTemporary unavailability, network flap, rate limitRetry after a delay503 Service Unavailable, timeout
ValidationBad input — wrong type, missing field, format errorFix the input, retry immediatelyinvalid date format: expected ISO8601
BusinessCorrect input but operation not permitted by domain rulesEscalate or skipcannot delete: record has active dependencies
PermissionCaller lacks authorizationStop and explain to user403 Forbidden: insufficient scope

Implementation pattern

Include the category in your error messages so Claude can act without guessing:

def call_tool(params):
try:
result = execute(params)
return {"content": [{"type": "text", "text": result}], "isError": False}
except NetworkError as e:
return {
"content": [{"type": "text", "text": f"[transient] {e}. Retry in a few seconds."}],
"isError": True
}
except ValidationError as e:
return {
"content": [{"type": "text", "text": f"[validation] {e}. Check the input format."}],
"isError": True
}
except PermissionError as e:
return {
"content": [{"type": "text", "text": f"[permission] {e}. Cannot proceed without elevated access."}],
"isError": True
}
except BusinessError as e:
return {
"content": [{"type": "text", "text": f"[business] {e}. Operation not permitted by domain rules."}],
"isError": True
}

Transient errors are the only category where automatic retry makes sense. Validation errors should be retried with corrected input, not blindly. Business and permission errors should stop and surface to the user rather than loop.

Tool descriptions are the most impactful part of an MCP server. Claude uses them to decide which tool to call — and a vague or overlapping description causes misrouting more reliably than any other design mistake.

The core problem: overlapping descriptions cause misrouting

Two tools with similar-sounding descriptions create ambiguity. Claude will pick one, often inconsistently, because it’s guessing from the description which one applies.

// Bad — ambiguous, Claude will guess
{ "name": "analyze_content", "description": "Analyzes content" }
{ "name": "analyze_document", "description": "Analyzes document content" }
// Good — each description carves out a specific input type
{ "name": "analyze_content", "description": "Analyzes raw text strings or inline content (not files). Use for clipboard content, API responses, or text passed directly as a string." }
{ "name": "analyze_document", "description": "Analyzes content from a file path or URL. Use when the content lives on disk or at a remote endpoint, not when you already have the text in memory." }

The test: can you read the description alone and know exactly when NOT to use this tool? If not, add the boundary.

Description anatomy

A good tool description has three parts, in this order:

  1. What it does — one sentence, present tense, action verb
  2. What it takes — the key input type or constraint (file path vs string, single vs batch)
  3. When to use it vs similar tools — the decision boundary, explicitly stated
{
"name": "search_codebase",
"description": "Searches source code files by regex pattern across the repository. Use for finding symbol definitions, function calls, and string literals in code. Not for searching documentation, configs, or prose — use search_docs for those."
}

Naming conventions that prevent misrouting

PatternExample pairWhy it works
Verb distinguishes intentget_user vs search_usersFetch known ID vs discover by criteria
Noun distinguishes input typeanalyze_file vs analyze_textPath on disk vs inline string
Scope suffixlist_tickets vs list_project_ticketsGlobal vs scoped
Action granularitycreate_record vs bulk_create_recordsOne vs batch

Avoid synonyms as tool names — fetch, get, retrieve all mean the same thing to Claude. Pick one verb family per semantic operation.

Anti-patterns to avoid

  • Generic verbs without scope: process, handle, manage tell Claude nothing about when to call the tool
  • Missing the boundary: “Searches the database” — which database? All of it? A specific table?
  • Boolean flags that change semantics: A tool that does completely different things based on a flag should be two tools
  • Descriptions longer than 3 sentences: If you need more, the tool does too much

input_examples as a complement

When a schema isn’t enough to express which parameter combinations are valid or typical, add input_examples (supported by Anthropic API since February 2026). These show Claude concrete usage patterns, especially useful for optional parameters:

{
"name": "create_ticket",
"input_examples": [
{ "title": "Login page 500 error", "priority": "critical", "assignee": "oncall" },
{ "title": "Add dark mode toggle", "priority": "low" },
{ "title": "Update API docs for v2.1" }
]
}

Examples teach what the description can’t: that assignee is only set for critical items, and priority can be omitted for routine tasks.


Beyond basic error taxonomy, three design decisions significantly affect how Claude uses MCP tools in production: error response semantics, the distinction between Resources and Tools, and tool naming.


The MCP specification does not include an isRetryable field in the error response schema. However, the convention of embedding retry guidance in structuredContent has emerged as a practical pattern for tools that call fallible external services.

{
"isError": true,
"content": [
{
"type": "text",
"text": "Database query timed out after 30s. Retrying with the same parameters is likely to succeed."
}
],
"structuredContent": {
"error": {
"code": "DATABASE_TIMEOUT",
"message": "Query timed out",
"isRetryable": true,
"retryAfterMs": 5000,
"suggestedAction": "Retry the same query after 5 seconds"
}
}
}

For non-retryable errors:

{
"isError": true,
"content": [
{
"type": "text",
"text": "Record not found. No record with ID 'usr_99999' exists in the database."
}
],
"structuredContent": {
"error": {
"code": "RECORD_NOT_FOUND",
"message": "No record found for ID: usr_99999",
"isRetryable": false,
"suggestedAction": "Verify the ID is correct before retrying"
}
}
}

The isRetryable flag is not something Claude reads natively from the MCP spec. It is read by your orchestration layer, which decides whether to retry or escalate. The pattern works because structuredContent is machine-readable and your code can check it before Claude does.


isError: false + Empty Content vs isError: true

Section titled “isError: false + Empty Content vs isError: true”

These two response shapes have completely different semantics. Confusing them causes silent failures that are hard to debug.

ResponseMeaning
isError: false + non-empty contentTool succeeded, here is the result
isError: false + empty contentTool succeeded, zero results found (legitimate empty state)
isError: trueTool failed: the operation could not complete
// Search returning no results: NOT an error
{
"isError": false,
"content": [
{
"type": "text",
"text": "No documents found matching query: 'quarterly report Q5 2024'"
}
]
}
// Search that failed to execute: IS an error
{
"isError": true,
"content": [
{
"type": "text",
"text": "Search service unavailable. Could not execute query."
}
]
}

When a search returns zero results, Claude should report that to the user and potentially try different terms. When a search fails to execute, Claude should report a tool failure and the orchestrator should consider retrying or escalating. These paths diverge, and only correct error semantics makes them diverge correctly.


Resources and Tools serve different purposes and are controlled by different actors. Mixing them up leads to tools that cannot be indexed and resources that cannot be parameterized.

DimensionResourcesTools
Who controls accessApplication (pre-defined, not model-initiated)Model (calls as needed during conversation)
ParametersNone (read by URI)Full parameter schema
Use caseRead-only data catalog: config files, reference data, documentsParameterized operations: search, compute, write, API calls
DiscoveryListed at startup, browsableDescribed in system prompt, called on demand
Side effectsNone (read-only by convention)Allowed
ExampleCompany policy documentsearch_policy_documents(query, date_range)
# Resource: static reference data, application-controlled
@server.list_resources()
async def list_resources():
return [
Resource(
uri="config://database/schema",
name="Database Schema",
description="Current production database schema",
mimeType="application/json"
),
Resource(
uri="docs://api/reference",
name="API Reference",
description="Internal API documentation",
mimeType="text/markdown"
)
]
@server.read_resource()
async def read_resource(uri: str) -> str:
if uri == "config://database/schema":
return json.dumps(get_current_schema())
elif uri == "docs://api/reference":
return read_file("docs/api-reference.md")
raise ValueError(f"Unknown resource: {uri}")
# Tool: parameterized operation, model-controlled
@server.list_tools()
async def list_tools():
return [
Tool(
name="search_database",
description="Search the database with a structured query",
inputSchema={
"type": "object",
"properties": {
"query": {"type": "string"},
"table": {"type": "string"},
"limit": {"type": "integer", "default": 10}
},
"required": ["query", "table"]
}
)
]

ResourceLink bridge: When a tool returns a reference to a resource (rather than inline content), use a ResourceLink:

{
"isError": false,
"content": [
{
"type": "resource",
"resource": {
"uri": "docs://reports/Q3-2024",
"mimeType": "application/pdf",
"text": "Q3 2024 Financial Report (use read_resource to access full content)"
}
}
]
}

Tool names that appear as keywords in the system prompt cause Claude to associate the tool with unrelated instructions. A tool named process will be mentally linked to any occurrence of the word “process” in the system prompt, creating unpredictable activation patterns.

Rules for tool names:

  • Use specific, compound names: search_customer_records not search
  • Avoid generic verbs that appear in system prompts: run, process, execute, handle, manage
  • Use underscores, not camelCase or hyphens (MCP convention)
  • Prefix with domain when there are many tools: crm_get_contact, crm_update_contact, crm_search
# Bad: generic names that conflict with system prompt keywords
tools = ["search", "process", "run", "execute", "get", "update"]
# Good: specific compound names with domain prefix
tools = [
"crm_search_contacts",
"crm_get_contact_by_id",
"crm_update_contact_status",
"billing_create_invoice",
"billing_get_invoice_status"
]

Providing every available tool to every agent call is wasteful and increases the risk of unintended writes during read-only phases. Task-scoped tool profiles restrict the available tools based on the current task phase.

TOOL_PROFILES = {
"exploration": [
"search_documents",
"get_document_by_id",
"list_categories",
"read_config"
],
"analysis": [
"search_documents",
"get_document_by_id",
"calculate_metrics",
"compare_versions"
],
"execution": [
"create_document",
"update_document",
"delete_document",
"send_notification"
]
}
def get_tools_for_phase(phase: str) -> list[str]:
return TOOL_PROFILES.get(phase, TOOL_PROFILES["exploration"])

The exploration profile is read-only. The execution profile adds write operations. Claude cannot accidentally call delete_document during an analysis phase because the tool simply is not present in the call.

For multi-role systems where different user roles can access different tools, scope at the role level rather than filtering post-call:

ROLE_TOOL_ACCESS = {
"viewer": ["search_documents", "get_document_by_id"],
"editor": ["search_documents", "get_document_by_id", "create_document", "update_document"],
"admin": ["*"] # all tools
}
def get_tools_for_role(role: str, all_tools: list) -> list:
if role == "admin":
return all_tools
allowed = ROLE_TOOL_ACCESS.get(role, [])
return [t for t in all_tools if t.name in allowed]

Scoped access is particularly valuable for the verify_fact tool pattern: a subagent that only needs to verify a single claim can be given only verify_fact, reducing both latency (fewer tools to describe in the context) and risk (no write tools in scope).


MVP (Essentials):

  1. Playwright MCP — E2E testing, web verification
  2. Semgrep MCP — Security-first coding

Important Additions:

  1. Context7 MCP — API reference accuracy
  2. Linear MCP (optional) — Issue tracking integration

DevOps/SRE Stack:

  1. Kubernetes MCP — Cluster management
  2. Vercel MCP — Next.js deployment automation

Complex Setups:

  1. MCP-Compose — Multi-server orchestration
  2. Browserbase MCP — Heavy web automation (premium)
Terminal window
# Playwright (browser testing)
npm install @microsoft/playwright-mcp
# Semgrep (security)
uvx semgrep-mcp
# Context7 (documentation)
npx -y @upstash/context7-mcp --api-key YOUR_API_KEY
# Linear (project management)
npm install mcp-linear
MetricMedianRangeNotes
Response Time~200ms100-500msCloud-dependent (Browserbase ~500ms)
Token Overhead~200-500 tokensMinimal for structured outputAccessibility trees vs screenshots
Setup Time~5 minutes2-10 minutesCargo build (MCP-Compose) = 10 min

This section documents the process for maintaining this guide with monthly ecosystem updates.

Official Sources:

Community Sources:

Discussions:

Technical Articles:

  • Official servers: Check Anthropic GitHub for new releases
  • Community servers: Review GitHub topics for trending servers (≥50 stars, <3 months release)
  • Ecosystem changes: Monitor Anthropic blog for protocol updates
  • Server health: Re-evaluate existing servers (releases, issues, maintenance)
  • Security: Check for disclosed vulnerabilities (GitHub Security Advisories)
  • Deprecations: Identify archived or unmaintained servers
  • Update guide: Add new validated servers, remove deprecated ones

For each candidate server:

  1. Basic Validation:

    • GitHub stars ≥50?
    • Last release <3 months?
    • Documentation complete (README + examples + config)?
    • Tests/CI present?
  2. Quality Scoring (see Evaluation Framework):

    • Maintenance: /10
    • Documentation: /10
    • Tests: /10
    • Performance: /10
    • Adoption: /10
    • Total: /50 → Normalized to /10
  3. Use Case Analysis:

    • What gap does it fill?
    • Is it already covered by official servers?
    • What are the alternatives?
  4. Decision:

    • Integrate (score ≥8): Add full section to guide
    • Monitor (score 6-7): Add to Watch List, re-evaluate next month
    • Reject (score <6): Document reason in Excluded Servers

When adding a new server:

  1. Create section in appropriate category (Browser Automation, DevOps, etc.)
  2. Include:
    • Use case description
    • Key features table
    • Setup instructions
    • Configuration examples
    • Quality score
    • Limitations & workarounds
    • Alternatives comparison
    • Resources (GitHub, docs, tutorials)
  3. Update Quick Start Stack if MVP-relevant
  4. Update Production Deployment checklist if security-critical

Documenting an MCP for Claude: The Reference File Pattern

Section titled “Documenting an MCP for Claude: The Reference File Pattern”

When you integrate an MCP server into a skill, Claude has to figure out the query syntax, required parameter combinations, and quirky behavior on its own. For simple MCPs this is fine. For anything production-facing (observability tools, project management APIs, log aggregators), it breaks down fast. Claude guesses at parameter format, gets a cryptic error, retries with a different guess, and burns your budget on noise.

The fix from the Packmind engineering team (open-sourced under Apache 2.0): add a references/<mcp-name>.md file alongside the skill, and have the skill read it as its first step before any MCP call.

Three types of content that Claude cannot reliably infer on its own:

1. Parameter semantics that differ from the tool name

For example, a Datadog “search” tool that uses Datadog query syntax (not regex). Or a Sentry tool that requires an organization_slug (the URL slug, not the display name). These are not bugs in the MCP; they are just non-obvious.

2. Known error patterns and what triggers them

For example: “If you use SELECT aliases in GROUP BY with DDSQL, you get a cryptic error. Repeat the full expression instead.” This turns a 10-minute debug session into a zero-second lookup.

3. Working query examples for the 80% case

Copy-paste examples that cover the most common queries. Claude can adapt them rather than constructing from scratch.

.claude/skills/my-mcp-skill/
├── SKILL.md # Main skill file
└── references/
└── <mcp-name>.md # MCP reference file (this pattern)

The SKILL.md reads the reference file in its first step:

## Step 1: Read the MCP Reference File
Before doing anything else, read `references/<mcp-name>.md`.
This contains the query syntax and known gotchas for this MCP.
Do not skip this step.

The reference file is not documentation for humans. It is a structured context injection. Every piece of information in it reduces the probability of a malformed MCP call by Claude. Done well, it eliminates retry loops caused by syntax errors and makes the skill reliable enough to run on a schedule without supervision.

This pattern generalizes to any MCP with non-obvious behavior: Datadog, Sentry, PagerDuty, Linear, Jira, Mixpanel, Posthog. If the MCP has a query language, pagination quirks, or required parameters with non-intuitive names, a reference file pays for itself in the first run.

A complete template skill demonstrating this pattern (with a Sentry example) is available at:

examples/skills/mcp-integration-reference/ in this repository

The template includes:

  • SKILL.md with the 5-step structure (read reference, gather scope, fetch, analyze, report)
  • references/sentry-mcp.md with complete parameter docs, gotchas, query examples, and noise exclusion list
  • Instructions for adapting to any MCP server

Inspired by the Datadog MCP reference file from the Packmind open-source repo (Apache 2.0, Cédric Teyton). See Credits for full attribution.


Servers evaluated but not included in the validated list:

ServerReasonSourceDate Evaluated
X/Twitter MCPAPI instability, frequent auth issues, inconsistent maintenanceCursor ForumJan 2026
Vector Search MCP<50 stars, incomplete documentationLobeHubJan 2026
GitHub MCPArchived, migrated to official Go SDKGitHub ChangelogJan 2026
Jira MCP (sooperset)No recent release (last: June 2025), less stable than LinearGitHub ReleasesJan 2026

CategoryServersUse Cases
Browser Automation3 (Playwright, Browserbase, Chrome DevTools)Testing, debugging, data extraction
DevOps/Infrastructure3 (Vercel, Kubernetes, Sentry)Deployment, cluster management, observability
Security/Code Analysis1 (Semgrep)Vulnerability scanning, secure coding
Code Search/Analysis1 (Grepai)Semantic search, call graph analysis
Documentation/Knowledge1 (Context7)API reference, code examples
Project Management1 (Linear)Issue tracking, sprint planning
Orchestration1 (MCP-Compose)Multi-server management
  • Official Servers (6): Playwright (Microsoft), Browserbase, Semgrep, Context7, Kubernetes (Red Hat), Chrome DevTools (Anthropic)
  • Community Servers (4): Linear, Vercel, MCP-Compose, Grepai (well-designed, actively maintained)

Last updated: May 2026 Next review: June 2026 Maintainer: Claude Code Ultimate Guide Team


Back to main guide | README