I keep seeing mcp.json files that look like a Steam library. Forty community servers, half of them abandoned npm packages, all enabled. Then someone asks why the agent never calls GitHub.
This directory is the opposite of that. Ten official servers. One product loop.
A day, not a shopping list
Think about the path a change already takes on a team that uses Cursor.
The ticket lives in Linear. The spec is a Notion page you wrote last Tuesday. The frame is still in Figma. The code will sit in git, and the review will happen on GitHub. While you write, you need today's Next.js or Stripe docs, which is Context7, not the model's memory of a release from last year. You need to look at the running page, which is Playwright. If the answer is on a random changelog that Context7 does not index, that is Firecrawl. The schema is in Supabase. The crash is in Sentry. If money moves, Stripe is the account, not a guessed Checkout shape.
That is one stack. It is also ten names, which is already a lot.
If your mcp.json is longer than the component you are editing, you have a hobby, not a setup.
What each one is for
I will not re-paste the install JSON here. Each server page has it. This is the job description.
Context7 is Upstash's hosted docs MCP. Cursor can see your repo. It cannot see this week's Tailwind or Next.js pages unless something fetches them. Without it, the agent invents APIs that used to exist.
GitHub's official hosted server is for the product: issues, pull requests, checks, code search. Local git is already there. This is github.com.
Linear is the ticket. GitHub is the PR. People mash those together in chat and then wonder why the agent cannot quote the acceptance line.
Notion is the spec you already wrote. If the truth is a database row in Notion and the agent only sees git, you get last week's export.
Figma is structured layout, variables, and a screenshot of the selection. A PNG in chat is a rumor. More on that in A Figma to Cursor loop.
Playwright is a real browser on your machine. That is why it is local stdio, not a URL. Microsoft's server drives navigate, snapshot, click. You use it when the page is localhost.
Firecrawl fetches public pages into markdown. Context7 is libraries. Firecrawl is "scrape this URL I am staring at." The install this directory documents is npx plus an API key.
Supabase talks to the platform: projects, tables, logs. It is how the agent looks at the schema before it writes CREATE TABLE.
Sentry is the stack frame in the other window. Paste an issue URL and stay in the file.
Stripe's hosted MCP is the Stripe account and the API, with OAuth or a restricted key. Context7 can still be better for "how does Checkout work in Next.js." Use both if you actually ship payments.
Why not twenty
Cursor will load whatever you put in mcp.json. The agent still gets a finite list of tools. In 2025, people on the Cursor forum measured that as the first 40 tools. The number may have moved. The failure mode did not: extra servers steal slots from the one you needed. I wrote that up in The 40-tool limit.
Eight of these ten are a URL. Two spawn a local process. That split is When remote HTTP is enough.
What I would put in a fresh mcp.json
Global file, for me, on every repo:
- Context7
- GitHub
- Linear (if the company lives there)
Project file, for the app I am in:
- Figma, if this repo has a file
- Supabase and Stripe, if this repo has those accounts
- Playwright, when I am looking at UI
- Sentry, when I am looking at a crash
Firecrawl and Notion stay off until a prompt needs the web or the spec.
You can paste all ten. Then open Settings, Tools & MCP, and kill the ones that are not in this hour's work. Connected is not the same as useful.
