{"slug": "one-mcp-server-three-config-schemas-wiring-pdf4me-into-cursor-vs-code-claude-and", "title": "One MCP Server, Three Config Schemas: Wiring PDF4me Into Cursor, VS Code, Claude Desktop, Windsurf and Continue", "summary": "PDF4me's MCP server, launched via a single `uvx pdf4me-mcp` command, requires three different configuration schemas across five clients: Cursor, Claude Desktop, and Windsurf use an object keyed by server name; VS Code uses a `servers` array with an explicit `type: stdio`; and Continue uses an array with a `name` field. The guide highlights that the environment variable is `API_KEY` (not prefixed) and that Windows users may need to provide the full path to `uvx` if it's not on PATH.", "body_md": "Five MCP clients. One server command. Three different config schemas.\n\nThat last part is the bit worth knowing before you wire a document API into an agent, because when you get it wrong nothing errors loudly. The server simply does not appear.\n\nEverything below comes from PDF4me's [MCP getting started guide](https://docs.pdf4me.com/integration/pdf4me-mcp/getting-started/), read in full on 16 August 2026.\n\nThe server is a single command:\n\n```\nuvx pdf4me-mcp\n```\n\nThe guide is explicit that this is shared, and says to use the same server command in all clients. Five clients are named: Cursor, VS Code, Claude Desktop, Windsurf, and Continue, with Continue covering both VS Code and JetBrains.\n\n`uvx`\n\nships with UV, so UV is the one prerequisite beyond a PDF4me API key. On Windows that is a PowerShell one-liner, on macOS and Linux it is available through brew, pipx or pip. The [UV documentation](https://docs.astral.sh/uv/) covers the options. What `uvx`\n\nbuys you is that there is no global package to install and keep updated. The runner fetches and executes the MCP server package on demand.\n\nSo far, a five minute setup. For one client, it is.\n\nHere is where the copy and paste breaks.\n\n`mcpServers`\n\nas an object keyed by server name\nCursor, Claude Desktop and Windsurf:\n\n```\n{\n  \"mcpServers\": {\n    \"pdf4me-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\"pdf4me-mcp\"],\n      \"env\": {\n        \"API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n`servers`\n\n, with an explicit transport type\nVS Code does not use `mcpServers`\n\nat all:\n\n```\n{\n  \"servers\": {\n    \"pdf4me-mcp-std\": {\n      \"type\": \"stdio\",\n      \"command\": \"uvx\",\n      \"args\": [\"pdf4me-mcp\"],\n      \"env\": {\n        \"API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nTwo differences from shape 1, not one. The property is `servers`\n\n, and `\"type\": \"stdio\"`\n\nis required.\n\n`mcpServers`\n\nas an array of named entries\nContinue keeps the property name and changes the container:\n\n```\n{\n  \"mcpServers\": [\n    {\n      \"name\": \"pdf4me-mcp\",\n      \"command\": \"uvx\",\n      \"args\": [\"pdf4me-mcp\"],\n      \"env\": {\n        \"API_KEY\": \"your-api-key-here\"\n      }\n    }\n  ]\n}\n```\n\nThe server name moves inside the entry as a `name`\n\nfield rather than acting as the object key.\n\nOne server, one command, three structurally different declarations. None of that is PDF4me's invention, it is the clients disagreeing with each other, but it is the thing most likely to cost you twenty minutes.\n\n| Client | Config file |\n|---|---|\n| Cursor | `~/.cursor/mcp.json` |\n| Claude Desktop (macOS) | `~/Library/Application Support/Claude/claude_desktop_config.json` |\n| Claude Desktop (Windows) | `%APPDATA%\\Claude\\claude_desktop_config.json` |\n| Claude Desktop (Linux) | `~/.config/Claude/claude_desktop_config.json` |\n| Windsurf | `~/.codeium/windsurf/mcp_config.json` |\n| Continue | `~/.continue/config.json` |\n\nWorth having the guide open rather than guessing.\n\nSmall detail, disproportionate annoyance. The environment variable is `API_KEY`\n\n. Not `PDF4ME_API_KEY`\n\n, not `PDF4ME_KEY`\n\n. All five config blocks pass it the same way, inside an `env`\n\nobject on the server entry.\n\nIf you have integrated PDF4me anywhere else, you have probably been sending the key as a Base64 encoded `Authorization: Basic`\n\nheader, which is what [Connect to the PDF4me V2 API](https://docs.pdf4me.com/general-guidelines/connect-to-pdf4meapi/) documents for direct REST calls. Under MCP you do not do that yourself. You hand the raw key to the server through the environment and the server handles the request signing. Worth noticing before you paste an already encoded value into the config and wonder why nothing authenticates.\n\nThe most common Windows failure has a documented answer. If `uvx`\n\nis not on your `PATH`\n\n, the client cannot resolve the command and the server never starts. Give the full executable path instead of the bare command:\n\n```\n\"command\": \"C:\\\\Users\\\\<YourUser>\\\\.local\\\\bin\\\\uvx\"\n```\n\nFrom the client's side this looks the same as any other silent non-start, so check it early.\n\nFastest way to separate a server problem from a config problem:\n\n```\nuvx pdf4me-mcp\n```\n\nOr with the key supplied inline, when the package is installed locally:\n\n```\nAPI_KEY=your-api-key-here pdf4me-mcp\n```\n\nIf that runs and your editor still shows nothing, the problem is the JSON shape or the file path, not the server. Two minute check that saves a much longer one. It is the same instinct behind PDF4me's [interactive API Tester](https://docs.pdf4me.com/url-api-tester/) for the REST endpoints: confirm the thing works in isolation before debugging it through three layers.\n\nPDF4me ships two things that sound similar and are not, and the documentation draws the line cleanly enough to borrow. MCP is tool calling: the agent invokes the server, and the server talks to PDF4me. [Agent Skills](https://docs.pdf4me.com/integration/pdf4me-agent-skills/getting-started/) is the other route, where you install a skill so agents know how to write REST API calls themselves. The MCP guide describes that as separate from MCP tool calling, which is the right framing.\n\nThe practical difference: with MCP the agent does not need to know what a PDF4me request body looks like, because it is not writing one. With Agent Skills it does, because it is. Which you want depends on whether you would rather the agent call a tool or author a call. They are not competitors and there is no reason a workspace cannot have both.\n\nFirst, confirm the server is actually registered rather than assuming. The guide's own final step is to open the client, verify the `pdf4me-mcp`\n\nserver is running, and trigger one action from the assistant. Do that with something harmless first.\n\nSecond, look at what the server exposes in your own client. This post deliberately does not print a tool list, because the getting started page does not publish one, and a capability list copied from marketing copy is not something to build a workflow on. The [source repository](https://github.com/pdf4me/pdf4me-mcp) is the place to look, and your client's own tool inspector is better still, because it shows what is loaded rather than what is documented.\n\nThat second point generalises past MCP. An agent calling your document API is a caller that cannot ask a clarifying question, cannot read a changelog, and will not notice that a tool it used last week now behaves differently. Whatever surface you hand it, the useful discipline is confirming that surface yourself first.\n\nWebsite: [pdf4me.com](https://pdf4me.com/)\n\nDocumentation: [docs.pdf4me.com](https://docs.pdf4me.com/)\n\nDeveloper portal: [dev.pdf4me.com](https://dev.pdf4me.com/)", "url": "https://wpnews.pro/news/one-mcp-server-three-config-schemas-wiring-pdf4me-into-cursor-vs-code-claude-and", "canonical_source": "https://dev.to/pdf4me/one-mcp-server-three-config-schemas-wiring-pdf4me-into-cursor-vs-code-claude-desktop-windsurf-2j5c", "published_at": "2026-08-16 09:01:01+00:00", "updated_at": "2026-08-16 09:11:49.692606+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "ai-agents"], "entities": ["PDF4me", "Cursor", "VS Code", "Claude Desktop", "Windsurf", "Continue", "UV"], "alternates": {"html": "https://wpnews.pro/news/one-mcp-server-three-config-schemas-wiring-pdf4me-into-cursor-vs-code-claude-and", "markdown": "https://wpnews.pro/news/one-mcp-server-three-config-schemas-wiring-pdf4me-into-cursor-vs-code-claude-and.md", "text": "https://wpnews.pro/news/one-mcp-server-three-config-schemas-wiring-pdf4me-into-cursor-vs-code-claude-and.txt", "jsonld": "https://wpnews.pro/news/one-mcp-server-three-config-schemas-wiring-pdf4me-into-cursor-vs-code-claude-and.jsonld"}}