MCP servers worth connecting to a coding agent
The servers that do real work in a Claude Code or Cursor setup — repositories, databases, browsers, files, and the project backlog — with what each one exposes.
Last reviewed 2026-08-27 · View as Markdown
Most lists of MCP servers are catalogues: everything anyone has published, sorted by star count. This is not that. It is the short set a working developer connects to a coding agent and keeps connected, grouped by what each one touches — the repository, the database, a browser, the filesystem, documentation, and the project backlog. For each server: what it exposes, which transport it speaks, where its configuration lives, and the one thing that goes wrong.
Two rules shaped the selection. Every server here was opened on its own
repository on the review date; nothing is included on reputation alone. And
"best MCP servers for developers" is read narrowly, as MCP servers for coding
agents rather than for chat: a server earns its place by doing something the
agent cannot already do with a shell and an editor. An agent that can run git
gains nothing from a git wrapper; a chat client with no shell gains a great
deal.
Where the configuration lives
Every server below is declared as a JSON block. The block is nearly the same everywhere; the file it goes in is not.
| Client | File | Notes |
|---|---|---|
| Claude Code | .mcp.json in the project root (shared), or ~/.claude.json for the local and user scopes | claude mcp add --transport http|stdio writes it for you |
| Cursor | .cursor/mcp.json in the project, ~/.cursor/mcp.json for every project | Remote servers take url and headers; local ones command, args, env |
| VS Code with Copilot | .vscode/mcp.json | The top-level key is servers, not mcpServers; an inputs array of promptString entries keeps secrets out of the file |
| Claude Desktop | claude_desktop_config.json, opened from Settings → Developer → Edit Config | Launches stdio servers with command and args under mcpServers |
The specification defines two transports: stdio, where the client launches the
server as a subprocess, and Streamable HTTP, where the server is a process the
client reaches over HTTP POST. The older HTTP+SSE transport is deprecated —
Claude Code's documentation still accepts --transport sse but tells you to use
HTTP where available. Prefer HTTP for anything hosted, and stdio for anything
that needs to see your local disk or browser.
Source control
The GitHub MCP server
Repository: github/github-mcp-server.
GitHub MCP is organised as toolsets — context, repos, issues,
pull_requests, actions, code_security, discussions, notifications,
projects and about two dozen in all — of which context, repos, issues,
pull_requests and users are enabled when you name none.
Transport: Streamable HTTP at https://api.githubcopilot.com/mcp/, hosted by
GitHub and authenticated with OAuth or a personal access token; or stdio through
the ghcr.io/github/github-mcp-server Docker image with
GITHUB_PERSONAL_ACCESS_TOKEN in the environment.
claude mcp add --transport http github https://api.githubcopilot.com/mcp/
Caveat: toolsets multiply. Every one you enable adds its tools to every model
call. Keep to the defaults, pass --toolsets (or GITHUB_TOOLSETS, which takes
precedence) with only what the session needs, and use --read-only — or
GITHUB_READ_ONLY=1 in Docker — when the agent is meant to read issues rather
than merge pull requests.
The git reference server
Repository: modelcontextprotocol/servers,
directory src/git. Run with uvx mcp-server-git --repository path/to/repo, it
exposes twelve operations: git_status, git_diff, git_diff_staged,
git_diff_unstaged, git_log, git_show, git_add, git_reset,
git_commit, git_branch, git_create_branch and git_checkout.
Transport: stdio.
Caveat: Claude Code, Cursor and Copilot already run git in a shell. This
server is for clients without one — Claude Desktop is the usual case — and is
redundant everywhere else.
Databases
Postgres MCP Pro
Repository: crystaldba/postgres-mcp.
The reference PostgreSQL server has been moved out of the main servers
repository into the archived collection, so this is the maintained option for
Postgres MCP work. Its tools cover the schema (list_schemas, list_objects,
get_object_details), queries (execute_sql, explain_query), and health and
index analysis (analyze_db_health, analyze_workload_indexes,
analyze_query_indexes, get_top_queries).
Transport: stdio by default, --transport=sse for the deprecated SSE form.
Installed with pipx install postgres-mcp, uv pip install postgres-mcp, or
the crystaldba/postgres-mcp Docker image; the connection comes from
DATABASE_URI.
{ "mcpServers": { "postgres": { "command": "postgres-mcp", "args": ["--access-mode=restricted"], "env": { "DATABASE_URI": "postgresql://user:password@localhost:5432/app" } } } }
Caveat: --access-mode=restricted is the read-only mode, with execution-time
limits, that the project intends for production; unrestricted can alter schema
and data. The connection string is a credential, so it belongs in env, and the
role it names should be one you would hand to a contractor.
Browsers
Playwright MCP
Repository: microsoft/playwright-mcp,
package @playwright/mcp. Playwright MCP drives a real browser through
structured accessibility snapshots rather than screenshots, which is why it
works with a model that has no vision: browser_navigate, browser_snapshot,
browser_click, browser_type, browser_evaluate, browser_wait_for and
their siblings. Chromium, headed, by default; --headless and
--browser firefox|webkit|msedge|chrome change that, and --caps adds the
optional vision, pdf, devtools, network, storage and testing tools.
Transport: stdio through npx @playwright/mcp@latest; --port 8931 runs it as
a standalone HTTP server that clients reach at http://localhost:8931/mcp.
claude mcp add playwright npx @playwright/mcp@latest
Caveat: the default profile is persistent, so a session that logged in to
something stays logged in for the next one. --isolated keeps the profile in
memory and discards it when the browser closes.
Chrome DevTools MCP
Repository: ChromeDevTools/chrome-devtools-mcp,
run with npx -y chrome-devtools-mcp@latest. Where Playwright MCP is for
driving pages, this one is for diagnosing them: performance traces, network
requests, console messages with source-mapped stack traces, screenshots, and
--browser-url=http://127.0.0.1:9222 to attach to a Chrome that is already
running.
Transport: stdio.
Caveat: the project's own warning is the caveat. It exposes the contents of the browser instance to the client, which can inspect, debug and modify anything in it. Attach it to a profile that is not logged in to anything you would mind the model reading.
Files
The filesystem MCP server
Repository: modelcontextprotocol/servers,
directory src/filesystem, package @modelcontextprotocol/server-filesystem.
Thirteen tools: read_text_file, read_media_file, read_multiple_files,
write_file, edit_file, create_directory, list_directory,
list_directory_with_sizes, directory_tree, search_files, move_file,
get_file_info and list_allowed_directories.
Transport: stdio.
{ "mcpServers": { "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/you/projects"] } } }
Caveat: this is the canonical Claude Desktop server and is redundant in a coding agent, which reads and edits files natively. Allowed directories come from the command arguments, or from MCP roots, which replace the argument list entirely when the client sends them; a server started with neither fails to initialise. It runs with your user's permissions, so that list is the whole security model.
Search and documentation
Context7
Repository: upstash/context7. Two tools:
resolve-library-id turns a library name into a Context7 id, and query-docs
returns current documentation for that id. It answers the thing a model with a
training cutoff cannot — what the API looks like today.
Transport: HTTP at https://mcp.context7.com/mcp, with an optional
Authorization: Bearer key for higher rate limits; or stdio through the
@upstash/context7-mcp package.
Caveat: the agent has to call resolve-library-id first and pick the right
library among near-duplicates. When an answer looks wrong, check which id it
chose.
The fetch server
Repository: modelcontextprotocol/servers,
directory src/fetch, run with uvx mcp-server-fetch. One tool, fetch, that
retrieves a URL and converts it to Markdown, with max_length (5,000 characters
by default), start_index for paging through a long page, and raw.
Transport: stdio.
Caveat: it obeys robots.txt for requests the model initiates but not for ones
you initiate, unless started with --ignore-robots-txt. Its own README notes it
can reach local and internal IP addresses, so a page the agent is told to fetch
can point it at something on your network.
Brave Search
Repository: brave/brave-search-mcp-server,
package @brave/brave-search-mcp-server. Eight tools — brave_web_search,
brave_local_search, brave_news_search, brave_image_search,
brave_video_search, brave_place_search, brave_summarizer and
brave_llm_context — behind a BRAVE_API_KEY.
Transport: stdio by default; --transport http with --port serves HTTP.
Caveat: eight tools for what is usually one capability. If the agent only ever
needs brave_web_search, the rest are schema overhead on every call — which is
why the server ships --enabled-tools and --disabled-tools.
The project backlog
Autoplans
An MCP server for project management is the entry most lists leave out, because a coding agent never asks for one. It asks for a plan, the plan arrives as a prompt, and it is gone when the session ends. Autoplans exposes projects and tasks as MCP tools so a session reads what it is meant to build from the backlog instead.
Transport: Streamable HTTP at https://autoplans.dev/api/v1/mcp, authenticated
with an API key as a bearer token. Clients limited to stdio use the
autoplans-mcp npm package, which bridges to the same endpoint.
{ "mcpServers": { "autoplans": { "type": "http", "url": "https://autoplans.dev/api/v1/mcp", "headers": { "Authorization": "Bearer apk_live_..." } } } }
What it exposes: around forty tools across projects, tasks, subtasks, comments,
assignment, branding, business plans, telemetry, and a code-agent group shaped
for working a backlog. list_tasks returns every task with parentTaskId,
dependsOnTaskIds, subtaskCount and commentCount, so one call carries the
whole graph; code_agent_get_task_with_dependencies answers whether a task can
be started yet. The full list is in MCP tools and the per-client
blocks are on the MCP server page.
Caveat: forty tools is a lot, and the next section is about exactly that. It is why the Autoplans desktop app and CLI ship a bundled plugin exposing thirteen task-shaped tools rather than the whole server, and why the Claude Code plugin connects the same server but adds skills for planning, starting and finishing work on top of it.
What tool count costs
Every tool a connected server exposes is a JSON schema attached to every model
call in the session. Add up the counts in this guide — thirteen for the
filesystem server, twelve for git, eight for Brave, around forty for Autoplans —
and you are past seventy before GitHub, Playwright and Chrome DevTools have
contributed theirs. The cost is tokens on every turn, but the failure mode is
worse than the cost: some inference endpoints refuse a large tool payload
outright, and free endpoints have answered 503 to the forty Autoplans tools.
That incident, and the reduction that followed, is written up in
the MCP tool count 503.
Three habits keep it in check.
- Connect the servers a task needs, not the servers you own. A project-scope
.mcp.jsonor.cursor/mcp.jsonper repository is the mechanism. - Use the server's own reduction flag: GitHub's
--toolsets, Brave's--enabled-tools, Playwright's--capsleft off, Postgres MCP Pro's restricted access mode. - Know what your client does with the list. Claude Code's documentation says
tool search is on by default and loads only tool names and server instructions
at session start, deferring the full definitions until a tool is needed — and
that it is disabled under a custom
ANTHROPIC_BASE_URLor withENABLE_TOOL_SEARCH=false. Cursor's and VS Code's documentation describe no such deferral, so assume the whole set is sent.
Questions
Which are the essential MCP servers for Claude Code?
Fewer than you would think, because Claude Code already has a shell, file tools and web fetch. The gap is whatever sits behind authentication or outside the repository: GitHub for issues and pull requests, a database server for the schema, Playwright for anything with a browser, and a backlog so the plan outlives the session. Context7 earns a place when the project depends on a fast-moving library.
How do I add an MCP server to Cursor?
Create .cursor/mcp.json in the project, or ~/.cursor/mcp.json for every
project, with an mcpServers object. A remote server takes url and optional
headers; a local one takes command, args and env. The entries that work
as MCP servers for Cursor work for Claude Code too; only the file moves. A
worked example is on the
Cursor MCP server configuration page.
Do I need a filesystem MCP server with a coding agent?
No. Claude Code, Cursor, Copilot, Windsurf and Cline read and edit files themselves. That server exists for chat clients that do not, and adding it to a coding agent gives the model two ways to do the same thing.
What is an MCP server for project management?
A server that exposes projects and tasks as tools, so the agent can read its backlog, check what a task depends on, and mark it done without a human relaying any of it. Autoplans is one. The Model Context Protocol guide covers the protocol itself, and why a coding agent needs a backlog covers the reasoning.