One-click install links for your MCP server: Cursor, VS Code, Claude and Goose
By Jake Marsh, who builds Taskhold. Updated 2026-10-31. Facts about other tools checked 2026-10-31. 8 min read.
Short answer: Cursor takes a base64 JSON server config at cursor://anysphere.cursor-deeplink/mcp/install, VS Code takes URL-encoded JSON at vscode:mcp/install (or the https redirect on vscode.dev), claude.ai prefills its Add custom connector dialog from connectorName and connectorUrl, and Goose reads goose://extension. Links are public, so never put a key in one: use OAuth.
An install link turns "copy this JSON into your config file" into one click. Each client has its own format, two of them encode the server config differently, and GitHub drops some of the links from READMEs. This guide gives the exact format for Cursor, VS Code, claude.ai and Goose, checked against each vendor's docs or source on 2026-10-31, with a worked example for an invented server called Acme Docs.
The fast path is the MCP config generator: type a name and URL and it builds every link, a README badge and an HTML button. We use the same links for Taskhold's own MCP server, which feeds the live board where you watch your coding agents work.
The four formats at a glance
| Client | Link | Config encoding | Header support |
|---|---|---|---|
| Cursor | cursor://anysphere.cursor-deeplink/mcp/install?name=NAME&config=CONFIG | JSON.stringify the server object, then base64 | Yes, in the config; use ${env:NAME} for the value |
| VS Code | vscode:mcp/install?CONFIG (https: vscode.dev/redirect/mcp/install?name=NAME&config=CONFIG) | JSON.stringify, then URL-encode | Not in a link; people add it after installing |
| claude.ai | https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=NAME&connectorUrl=URL | Plain query parameters, URL percent-encoded | None: custom connectors use OAuth or no auth |
| Goose Desktop | goose://extension?url=URL&name=NAME&description=TEXT | Plain query parameters | header=Name=value params; a link with headers opens the settings form |
Checked 2026-10-31 against the sources listed at the end of this page.
Add to Cursor
Cursor's install link is cursor://anysphere.cursor-deeplink/mcp/install with two parameters: name, the key the server gets in mcp.json, and config, the server object run through JSON.stringify and then base64. The config is what would sit under that key in mcp.json, so a remote server is just its url. For Acme Docs at https://mcp.acme-docs.dev/mcp:
const config = { url: "https://mcp.acme-docs.dev/mcp" };
const encoded = Buffer.from(JSON.stringify(config)).toString("base64");
// btoa(JSON.stringify(config)) in a browser, for ASCII-only configs
const deeplink = `cursor://anysphere.cursor-deeplink/mcp/install?name=acme-docs&config=${encodeURIComponent(encoded)}`;
// cursor://anysphere.cursor-deeplink/mcp/install?name=acme-docs&config=eyJ1cmwiOiJodHRwczovL21jcC5hY21lLWRvY3MuZGV2L21jcCJ9Cursor's install-links doc shows only the cursor:// form. Cursor also serves https://cursor.com/install-mcp with the same name and config parameters, a web page that hands off to the app, and that https form is the one to put in a README, where GitHub won't keep a cursor:// href. Cursor's install-links page also shows dark and light "Add to Cursor" buttons for the same link.
Install in VS Code
VS Code's URL handler is vscode:mcp/install followed by the whole server config as URL-encoded JSON, with the name inside the object rather than in its own parameter. VS Code Insiders uses vscode-insiders:mcp/install. A remote server needs type http and its url:
const server = { name: "acme-docs", type: "http", url: "https://mcp.acme-docs.dev/mcp" };
const link = `vscode:mcp/install?${encodeURIComponent(JSON.stringify(server))}`;
// https form for READMEs and web pages: vscode.dev 302s to the vscode: link above
const web = `https://vscode.dev/redirect/mcp/install?name=acme-docs&config=${encodeURIComponent(JSON.stringify({ type: "http", url: "https://mcp.acme-docs.dev/mcp" }))}`;
// Insiders: https://insiders.vscode.dev/redirect/mcp/install?... (same parameters)The vscode.dev redirect takes name and config as separate parameters and answers with a 302 to vscode:mcp/install carrying both (checked with curl on 2026-10-31). The same JSON also works on the command line: code --add-mcp '{"name":"acme-docs","type":"http","url":"https://mcp.acme-docs.dev/mcp"}' adds it to the user profile. VS Code can prompt for a secret with ${input:...} variables, but those need an inputs array that the install handler doesn't document, so leave headers out of VS Code links. More on where VS Code keeps the result is on the VS Code mcp.json page.
Add to Claude: the custom connector link
Claude's link for a server that isn't in the connector directory opens the Add custom connector dialog on claude.ai with the name and URL filled in: https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=NAME&connectorUrl=ENCODED_URL. modal must be add-custom-connector, connectorName is the display name, and connectorUrl is the server URL percent-encoded:
https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Acme%20Docs&connectorUrl=https%3A%2F%2Fmcp.acme-docs.dev%2Fmcp- Claude shows a notice that the values came from an external link, and the person confirms before anything is added. A signed-out visitor signs in first, then sees the filled-in dialog.
- Organization Owners can use the same parameters on https://claude.ai/admin-settings/connectors to fill in the org-wide dialog.
- A server listed in the directory gets a permanent link instead, https://claude.ai/directory/connectors/SLUG.
- No header parameter exists. Claude reaches the server from Anthropic's cloud, so it must be public, and it signs in with OAuth or connects with no auth. When it won't connect, see Claude custom connector won't connect.
Add to Goose
Goose Desktop's deeplink is goose://extension. name is required; a url parameter makes it a streamable HTTP extension, and cmd with repeated arg parameters makes it a local stdio one (cmd must be one of npx, uvx, docker, jbang, goose, cu or npx.cmd). description and timeout are optional:
goose://extension?url=https%3A%2F%2Fmcp.acme-docs.dev%2Fmcp&name=Acme+Docs&description=Search+Acme+product+docsGoose's handler also reads header=Name=value and env=NAME parameters. When a link carries either, Goose opens the extension settings form for the person to fill in instead of installing straight away, so a header with an empty value is the way to ask for a key. GitHub strips goose:// links from READMEs, so a Goose button only works on your own site.
Never put a secret in an install link
An install link is a public URL. Base64 is an encoding, not encryption, so anyone who sees a Cursor link can decode the config, and every link ends up in browser history, analytics, chat logs and the README's git history. A link that carries a real key leaks it; a link with a placeholder key installs a server that answers 401 until the person edits the config, and a fixed bad header can stop the client from falling back to sign-in.
- Best: support OAuth on the server. Every client here then opens your sign-in page on first connect, and the link needs only a name and URL. claude.ai has no other way to sign people in.
- Cursor: if you need a header, make its value an environment reference. Cursor resolves ${env:NAME} in url and headers, so a config of {"url":"https://mcp.acme-docs.dev/mcp","headers":{"Authorization":"Bearer ${env:ACME_DOCS_API_KEY}"}} is safe to publish. Tell people to set ACME_DOCS_API_KEY in their shell profile before opening Cursor.
- VS Code: leave the header out of the link and tell people to add it, or ship an inputs-based mcp.json for them to paste.
- Goose: send header=Authorization= with no value, and Goose asks for it.
Taskhold's own buttons follow the first rule: each carries the URL and the name taskhold, and the client finds the sign-in from the 401 on its first request. Is it safe to connect Claude Code to a task list covers what an MCP key can reach.
Badges for a README, buttons for a web page
GitHub sanitizes README HTML: it removes inline styles and keeps only links with safe schemes, so cursor://, vscode: and goose:// hrefs don't survive and a styled HTML button renders as plain text. In a README use an image badge that links to an https form:
[](https://cursor.com/install-mcp?name=acme-docs&config=eyJ1cmwiOiJodHRwczovL21jcC5hY21lLWRvY3MuZGV2L21jcCJ9)
[](https://vscode.dev/redirect/mcp/install?name=acme-docs&config=%7B%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.acme-docs.dev%2Fmcp%22%7D)
[](https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Acme%20Docs&connectorUrl=https%3A%2F%2Fmcp.acme-docs.dev%2Fmcp)- On your own site, a plain <a> styled as a button works with any scheme, including cursor:// and goose://. Label it with the action ("Add to Cursor") and keep the URL visible somewhere for people who want to paste it by hand.
- Custom schemes do nothing on a phone or on a computer without the app installed, so show the https forms first, or say which app the button needs.
- Docs sites built from markdown run their own sanitizers, so check the rendered page before relying on a custom-scheme link there.
Build them with the generator
The MCP config generator builds every link above in your browser: enter the server name, URL and, optionally, a header name. It never asks for the header value, and the Cursor link it builds references an environment variable named after your server. It outputs the links, the README badges and HTML buttons, and the config file for each client. The Cursor mcp.json page and the VS Code page show the full config those links install. If a client installs the server but its tools never show up, start with Cursor MCP server not connecting or VS Code MCP tools not showing.
See how far along your coding agents are.
$12/month or $120/year after the trial. Card up front. Cancel before day 7 and you pay nothing. Every agent you run is included.
Questions
- How do I make an "Add to Cursor" button for my MCP server?
- Base64-encode the JSON server object (for a remote server, {"url":"https://..."}) and link to cursor://anysphere.cursor-deeplink/mcp/install?name=NAME&config=ENCODED. For READMEs, use https://cursor.com/install-mcp with the same parameters, since GitHub drops cursor:// links.
- What is the VS Code MCP install link format?
- vscode:mcp/install followed by the URL-encoded JSON config, including name, type and url. For web pages and READMEs use https://vscode.dev/redirect/mcp/install?name=NAME&config=ENCODED_JSON, which redirects to the vscode: link. Insiders uses vscode-insiders: or insiders.vscode.dev.
- Can I link people straight to adding my connector in Claude?
- Yes. https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=NAME&connectorUrl=ENCODED_URL opens the Add custom connector dialog with both fields filled in. The person still reviews and confirms. Directory connectors use https://claude.ai/directory/connectors/SLUG instead.
- Can an install link include an API key?
- Never a real one: install links are public and base64 is readable by anyone. Use OAuth so each client asks people to sign in. In Cursor you can reference an environment variable with ${env:NAME} in a header; in Goose an empty header value prompts for it.
- Why doesn't my Goose or Cursor button work on GitHub?
- GitHub's sanitizer only keeps links with safe schemes such as https, so goose:// and cursor:// hrefs are removed. Link Cursor badges to https://cursor.com/install-mcp and VS Code badges to vscode.dev/redirect. Goose has no https form, so its button belongs on your own site.
Sources
- Cursor docs: MCP install links, checked 2026-10-31
- Cursor docs: MCP (config interpolation, OAuth), checked 2026-10-31
- VS Code docs: MCP developer guide (URL handler), checked 2026-10-31
- VS Code docs: MCP configuration reference (--add-mcp, input variables), checked 2026-10-31
- Claude docs: directory vs custom connectors (install links), checked 2026-10-31
- Goose source: deeplink handler, checked 2026-10-31
- github/markup: how README HTML is sanitized, checked 2026-10-31
Related
Updated 2026-10-31. Something wrong or out of date? Email hello@greatwork.company.