MCP clients and remote servers
Connect Claude Code, Cursor, Codex, Claude, ChatGPT and other MCP clients to Sallyport, and give your agents remote MCP servers.
On this page
- The endpoint
- Connect by signing in
- The consent screen
- What “Allow” does
- Connected apps
- Platforms with an agent per machine
- Get an agent token
- Claude Code with a token
- Cursor and a project .mcp.json
- Codex CLI, Gemini CLI and VS Code with a token
- What the agent sees
- Connect a remote MCP server
- Sign in to a server with OAuth 2.1
The endpoint
Every MCP client connects to https://mcp.sallyport.cloud/mcp over Streamable HTTP. Clients on the 2026-07-28 revision of MCP and on earlier revisions both work.
Most clients connect by signing in: you add the address, sign in to Sallyport in your browser and press “Allow”. No token to copy, nothing to set up in the console first. Scripts and clients without a sign-in send an agent token in the Authorization: Bearer header instead.
Connect by signing in
Claude, Claude Code, ChatGPT, Codex, Cursor, VS Code, Gemini CLI and MCP Inspector connect this way. Each client’s page under Integrations shows where the address goes.
- Add
https://mcp.sallyport.cloud/mcpas an MCP server in your client. - The client registers itself with Sallyport and opens it in your browser.
- Sign in, or create an account. The connection waits 30 minutes for you, long enough to confirm your email.
- Read the consent screen, “Let … connect an agent”, and press “Allow”. The browser goes back to the client, and the client is connected.
The consent screen
“Who is asking” names the client. A client known by its own website shows “Verified domain” with that domain, and “Published by Anthropic” for claude.ai or “Published by OpenAI” for chatgpt.com. A client that registered itself shows “Unverified” and “This client registered itself. Sallyport could not check its name.”
“Where you go next” says where your browser lands after “Allow”: a website or an app. A program on your computer reads “After you allow, you go back to an app on this computer”. A link somebody else sent you is a reason to press “Refuse”. The screen warns: “Allow only if you started this connection from an app on this computer a moment ago.”
“What the agent can use” lists each service with “Runs directly” or “Asks you first”. A member’s new agent shows “Nothing yet. An admin gives this agent services in the console.”
“Details” holds the client ID, the redirect address and, with more than one workspace, the workspace the agent joins.
What “Allow” does
Sallyport creates an agent named after the client. An owner’s or admin’s agent gets every service of the workspace. A member’s agent starts with none until an admin adds them under “Access” on the agent’s page.
The first time a person connects a client, every owner gets a notification with a link that disconnects it. The journal records every consent.
A client signs in again from a new session, a new port or when it renews its access. While the agent is active, you see a short “Reconnect Claude Code” screen with one “Reconnect” button. Nothing goes to the client until you press it. Owners are not notified again. If the agent was paused, the full consent screen asks again. If it was deleted, signing in again is a new connection and every owner is notified.
Connected apps
Settings, Connected apps lists every AI client that signed in. Members see and disconnect their own. Owners and admins see and disconnect everyone’s.
“Disconnect” ends the client’s access: “Its calls stop at once, on every computer it signed in from. To use it again, sign in from the app and allow it.”
Platforms with an agent per machine
A platform that runs agents on machines of its own, such as detachbox, connects once. Its consent screen is a short card: who is asking, where you go next, and three lines. detachbox can create an agent for each of its machines, see your agents and put them in chats. It can rename, pause or delete only the agents it created. Each new agent starts with no access, and you choose what each one can use. The connection itself is no agent and uses no service, so the card lists none.
Each machine gets its own agent, so Activity and approvals show which machine called. A new machine’s agent can use nothing. detachbox sends you to its page, you pick its services or copy another agent’s access, and “Done” takes you back. Connected apps shows how many agents the app manages, each with its machine. Pausing one agent stops one machine. “Disconnect” stops them all, and they come back with their access when you connect again. All machines of one connection count as one agent on every plan.
Get an agent token
A token suits a script, a project file shared through git or a client without a sign-in. Open the agent in Agents. “Connect this agent” copies a ready setup for Claude Code, Cursor or a project .mcp.json file. It carries the token you just made with “New token”, or a new one.
For another client, press “New token” under “Tokens” and copy it: it is shown once. The token names the agent and its access. It holds no service key.
The bin button beside a token revokes it. “Allowed IP addresses (optional)” under “Limits” restricts where the agent’s tokens work.
Claude Code with a token
Press “Copy for Claude Code” and run the command in a terminal. --scope user adds Sallyport to every project. Check it with claude mcp list, then restart Claude Code.
export SP_AGENT_TOKEN='<agent-token>'
claude mcp add --transport http --scope user sallyport https://mcp.sallyport.cloud/mcp --header "Authorization: Bearer $SP_AGENT_TOKEN"“Paste into Claude” gives a message instead. Press “Copy message for Claude”, paste it into a Claude Code chat, and Claude runs the command itself.
“Label each Claude Code session” is optional. Press “Copy session hook for Claude” and paste it into Claude Code. Each call then shows the session and folder it came from.
Cursor and a project .mcp.json
“Copy for Cursor” gives this for ~/.cursor/mcp.json, with the token filled in:
{
"mcpServers": {
"sallyport": {
"url": "https://mcp.sallyport.cloud/mcp",
"headers": {
"Authorization": "Bearer <agent-token>"
}
}
}
}“Copy .mcp.json” gives the same with "type": "http", for a project’s .mcp.json in Claude Code. That file carries the token, so keep it out of git.
Codex CLI, Gemini CLI and VS Code with a token
Set these up by hand with the same address and token.
[mcp_servers.sallyport]
url = "https://mcp.sallyport.cloud/mcp"
bearer_token_env_var = "SP_AGENT_TOKEN"
tool_timeout_sec = 300Codex reads the token from SP_AGENT_TOKEN in the environment that starts it. Sallyport keeps a call that waits for approval open for at most 240 seconds. With tool_timeout_sec = 300, Codex waits that long; its default is 60 seconds.
{
"mcpServers": {
"sallyport": {
"httpUrl": "https://mcp.sallyport.cloud/mcp",
"headers": {
"Authorization": "Bearer <agent-token>"
}
}
}
}{
"servers": {
"sallyport": {
"type": "http",
"url": "https://mcp.sallyport.cloud/mcp",
"headers": {
"Authorization": "Bearer <agent-token>"
}
}
}
}Gemini CLI takes the address in httpUrl. VS Code opens its file with “MCP: Open User Configuration”. Replace <agent-token> and keep these files out of repositories.
What the agent sees
Each service arrives as tools named after it. An HTTP service has two: github_read takes reads only, and github_write takes every call. Both take method and the full path from the service’s API docs:
{
"method": "GET",
"path": "/user"
}A database gets _query and _execute tools, and an SSH host gets _exec for commands plus _sftp_read and _sftp_write for its files. A mailbox gets _read, _send and _change. A remote MCP server’s tools keep their own names after the connection’s name. Every agent also has the built-in tools:
| Tool | What it does |
|---|---|
list_access | Every service the agent can reach: its tools, what runs straight through, what waits for a person and whether its key works. |
http_request | Calls any public HTTPS URL. A host without a key becomes an access request with a link for you. |
request_access | Asks for a service by host or name, with a purpose for the person who grants it. |
get_call | The state of a call, including one that waits for approval. |
list_requests | The agent’s access requests: open, granted, or refused with a reason. |
cancel_request | Withdraws an access request, or the agent’s own call that waits for a person. |
ssh_exec | Runs a command on an SSH host by its host name. Appears once the agent has an SSH host; a host outside its list becomes an access request with a link for you. |
fetch_body | The rest of a long answer. |
feedback | A note to the Sallyport team about what got in the agent’s way. |
search_tools, call | Appear when the list passes 40 tools: find a remote MCP server’s tool, then run it. |
A call that waits for a person tells the client at once, if the client sent a progressToken. That progress notification, and every later one of the call, carries _meta with sallyport.cloud/call_id and sallyport.cloud/approve_url. The message text holds the approve link too, so any client can show it.
Connect a remote MCP server
Open Remote MCP. Enter the “MCP server URL”: the full HTTPS endpoint with any non-default port and its path, such as https://mcp.example.com/mcp.
Choose the “Authentication”: “No authentication”, “Bearer”, “Basic”, “API key” in a header or query parameter, or “OAuth 2.1”. Press “Save credential and connect”.
Every agent of the workspace gets the server’s tools. Sallyport connects to the server, adds its key and returns the results. The agent stays connected to https://mcp.sallyport.cloud/mcp only.
Sign in to a server with OAuth 2.1
With “OAuth 2.1”, saving opens the server’s sign-in page and then brings you back to the connection. Sallyport keeps the tokens and renews them.
Sallyport registers itself with servers that allow it. For any other server, register an app with the redirect URI https://mcp.sallyport.cloud/callback/upstream. Enter its ID in “Application client ID (optional)”, and its secret if it has one.
When access runs out, press “Reconnect with OAuth” on the connection’s page.