McProxy
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@McProxyguide me through adding my first connector"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
McProxy
A local, multi-tenant Model Context Protocol server framework for
macOS, paired with a browser-based connection manager at 127.0.0.1:7337. It puts several
third-party services behind one MCP server, so a client like Claude Desktop or Claude Code sees one
process instead of one per integration.
What it deliberately does not include
McProxy ships zero connectors. src/connectors/descriptors/ is empty and the descriptor
registry is an empty array — there is nothing to configure, nothing to authorize, and no tool beyond
ping until you add one. This is the framework's central decision, not an oversight: shipping
someone else's integration would ship the shape of their credentials too. Every connector — its
fields, its auth flow, its probe — is added per install, either by a human following a guide or by an
AI agent running a setup interview.
Related MCP server: orchard-mcp
Quick start
git clone https://github.com/DykstraSound/McProxy.git
cd McProxy
npm install
cp .env.example .env
npm run guinpm run gui opens the connection manager in your browser. With no connectors configured yet, the
page has nothing to show — that's expected. The MCP server itself (npm run dev, or dist/server.js
after npm run build) also runs fine at this point; it answers ping and nothing else until a
connector exists.
Adding your first connection
See docs/ADDING-A-CONNECTOR.md to write a connector descriptor
yourself, or docs/AGENT-SETUP.md to have an AI agent walk you through it.
The descriptor model
Every connector is one file exporting one object: fields, auth kind, a live probe, an optional
identity check, and an optional reconnect flow. The GUI, the .env resolver, and the tool-layer
account scoping are all generic over this one shape — adding a connector never touches any of them.
export default defineConnector({
id: "example",
displayName: "Example",
kind: "native",
envPrefix: "EXAMPLE", // {PREFIX}_ACCOUNTS / {PREFIX}_{SLUG}_{FIELD}
multiInstance: true,
manageable: true,
auth: "oauth",
fields: [{ key: "API_KEY", label: "API key", secret: true, required: true }],
async probe(inst) { /* live reachability check — never rejects */ },
async identity(inst) { /* real remote account, for the identity-mismatch check */ },
authorize(inst) { return { script: "scripts/authorize-example.ts", args: [inst.slug] }; },
});What it guarantees
Third-party content is fenced before it reaches a model. Every tool result that carries data fetched from a connected service is wrapped in a nonce-tagged envelope, minted after the payload exists so nothing in it can forge a matching close marker (
src/shared/tools/untrusted.ts).Secrets never leave the server through the API. The connection list masks every field marked
secretto a four-character prefix/suffix and the write-side form never echoes a stored value back (src/gui/api.ts,maskSecret/fieldViews)..envis written by exactly one module, which preserves comments and untouched lines byte for byte and takes a timestamped backup before every write (src/connectors/env-file.ts).Every file under
~/.mcproxyis 0600 and every directory is 0700, enforced on every server and GUI start, not just at creation (src/shared/secure-fs.ts).A probe never answers from a cache. Instance resolution is never memoized — a
.envedit is live on the next call, not the next restart (src/connectors/instances.ts) — and the cached status a connection displays is written only by an explicit Test or reconnect, never inferred (src/connectors/status.ts).Absence is reported as absence, never as health. A connector nobody has tested renders
never-checked, not a default "ok" (src/connectors/status.ts); a config change is detected by re-resolving live state, never assumed from what was last observed.
Requirements
macOS, Node ≥ 22. Platform-agnostic support is an explicit non-goal.
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityBmaintenanceA macOS MCP server that provides AI agents with secure access to Calendar, Reminders, Notes, and Health data via native Apple APIs.3018MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for Apple Calendar, Mail, Reminders, and Files on macOS using native frameworks.3116MIT
- AlicenseAqualityCmaintenanceMCP server for privacy-gated local Apple data access including Mail, Messages, Notes, Calendar, Contacts, Photos, Reminders, Voice Memos, and iCloud Drive.301MIT
- AlicenseNot gradedqualityBmaintenanceA local macOS MCP server for AI Agents that exposes safe endpoints for shell commands, files, processes, macOS automation, browser control, and more.2MIT
Related MCP Connectors
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Self-hosted federated MCP gateway: one OAuth 2.1 MCP server in front of N apps, user-level scopes.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/DykstraSound/McProxy'
If you have feedback or need assistance with the MCP directory API, please join our Discord server