← MCP Gateway

Add it to your agent, then just ask

Connecting the gateway is one config change. After that your agent discovers 139 tools by itself and you go back to typing ordinary sentences.

What it looks like

Two things people actually type once the gateway is connected. The first has the agent onboard itself: agent.txt documents the signup call, so the agent can read it and claim the free credit without you leaving the chat.

Read https://gateway.mcpharbor.dev/agent.txt and sign up for the free trial.

Reading agent.txt… it documents a signup endpoint.

POST https://gateway.mcpharbor.dev/v1/signup

Done. You have $10.00 of credit, about 100,000 tool calls. I have saved the key. Discovery is free; each tool call costs $0.0001.

What does the express package depend on?

npm_registry__npm_deps  $0.0001

express v5.2.1 has 28 dependencies, including qs, send, cookie, debug and etag.

Find recent research on the Model Context Protocol.

openalex__openalex_search_entities  $0.0001

2,600,858 works match. The most cited recent one is Model Context Protocol (MCP): Landscape, Security Threats, and Future Research Directions (2026).

Illustrative, not a recording. Your agent picks the tool; the gateway routes it and bills the call.

Setup, once

Replace YOUR_KEY with your API key. Field names differ between clients — servers against mcpServers, url against serverUrl — and the wrong one fails in a way that looks like the gateway is down, so each snippet below is the one that client's own docs specify.

Run this in your terminal. No file to edit.

claude mcp add --transport http --scope user mcpharbor \
  https://gateway.mcpharbor.dev/mcp \
  --header "Authorization: Bearer YOUR_KEY"

claude mcp list          # confirm it connected

Watch out: This puts your key in shell history. To avoid that, add it to a project .mcp.json instead and reference an environment variable: the JSON field is "type": "http", not transport, and an entry with a url but no type is read as a stdio server and skipped.

Verified against Claude Code MCP docs.

Settings → Connectors → Add custom connector.

Name:            MCP Harbor
MCP server URL:  https://gateway.mcpharbor.dev/mcp
Authentication:  No sign-in
Request headers:
  authorization  ->  Bearer YOUR_KEY

Watch out: Choose No sign-in; on an OAuth connection Claude owns the Authorization header and you cannot set it. Type the word Bearer and a space before your key — the value is sent verbatim. Authentication cannot be edited after the connector is added, so rotating the key means removing and re-adding it. If your dialog has no Request headers section, your organization does not have that beta yet; use the mcp-remote bridge instead.

Verified against Anthropic custom connector docs.

~/.cursor/mcp.json for every project, or .cursor/mcp.json for one.

{
  "mcpServers": {
    "mcpharbor": {
      "url": "https://gateway.mcpharbor.dev/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_KEY"
      }
    }
  }
}

Verified against Cursor MCP docs.

.vscode/mcp.json in your project. VS Code prompts for the key and stores it securely.

{
  "inputs": [
    {
      "type": "promptString",
      "id": "mcpharbor-key",
      "description": "MCP Harbor API key",
      "password": true
    }
  ],
  "servers": {
    "mcpharbor": {
      "type": "http",
      "url": "https://gateway.mcpharbor.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${input:mcpharbor-key}"
      }
    }
  }
}

Watch out: The top-level key is servers, not mcpServers as in most other clients. Use the Start action VS Code shows above the entry, then ask in Copilot Chat in Agent mode. Do not add comments — this file is plain JSON.

Verified against VS Code MCP configuration.

~/.codeium/windsurf/mcp_config.json

{
  "mcpServers": {
    "mcpharbor": {
      "serverUrl": "https://gateway.mcpharbor.dev/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_KEY"
      }
    }
  }
}

Watch out: The field is serverUrl here, not url. Cascade also caps itself at 100 tools in total, so a large gateway catalogue can crowd out your other servers — that shows up as tools quietly missing rather than as an error.

Verified against Cascade MCP docs (published under Devin Desktop since the Windsurf rebrand).

Python. pip install openai-agents

import asyncio, os
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp

async def main():
    async with MCPServerStreamableHttp(
        name="MCP Harbor",
        params={
            "url": "https://gateway.mcpharbor.dev/mcp",
            "headers": {"Authorization": f"Bearer {os.environ['MCPHARBOR_API_KEY']}"},
            "timeout": 30,
        },
    ) as server:
        agent = Agent(name="Assistant", mcp_servers=[server])
        result = await Runner.run(agent, "What does the express package depend on?")
        print(result.final_output)

asyncio.run(main())

Watch out: Two keys are needed: MCPHARBOR_API_KEY for the gateway and OPENAI_API_KEY for the model running the agent. Setting only the first gives an authentication error from OpenAI, which looks like our problem but is not. Use MCPServerStreamableHttp, not MCPServerSse.

Verified against OpenAI Agents SDK MCP docs.

Then what

If a client reports the server as unauthorized, check the key has no trailing whitespace and that Bearer precedes it. This gateway uses a static bearer token and does not use OAuth, so any prompt to sign in means the header is not reaching us.

Read agent.txt Browse every tool