Connect a client

Add the Telflo MCP server to Claude Code, claude.ai, Cursor, VS Code, or another MCP client, and sign in as yourself or with a service-account token.

Every MCP client connects to the same hosted server and either signs you in through your browser or sends an API token from a service account. Two ways to sign in compares the two.

Server URL

https://mcp.telflo.com/mcp

The server uses Streamable HTTP; when a client asks for a transport or type, choose http. The URL is the same for every organization: the credential the client sends decides who the agent acts as. A token also fixes the organization; a sign-in picks one per call. A client that runs only local stdio servers needs a bridge to this URL, such as the community mcp-remote package.

Set up your client

Each tab shows the browser sign-in, then a service-account token where the client can send one, following the client's own documentation as of October 2026. Configure one or the other: with a token configured, Claude Code and Codex CLI do not fall back to the browser sign-in. Most token examples read the value from TELFLO_API_TOKEN, the variable the CLI uses, so it stays out of the configuration file.

Sign in as yourself

claude mcp add --transport http telflo https://mcp.telflo.com/mcp

Add --scope user for every project, or --scope project to share it through .mcp.json. Start claude, run /mcp, select telflo, choose Authenticate, and finish in the browser. On a machine without a browser, newer releases offer claude mcp login telflo, which prints the sign-in URL and takes the redirect URL back at the prompt.

Use a service-account token

.mcp.json
{
  "mcpServers": {
    "telflo": {
      "type": "http",
      "url": "https://mcp.telflo.com/mcp",
      "headers": {
        "Authorization": "Bearer ${TELFLO_API_TOKEN}"
      }
    }
  }
}

Claude Code expands ${TELFLO_API_TOKEN} from each person's environment, so the file can be committed; an unset variable is sent as literal text and fails with a 401. Passing the token to claude mcp add --header instead writes its value to ~/.claude.json.

See Claude Code's MCP documentation.

claude.ai and Claude Desktop add remote servers as custom connectors on your Claude account.

Sign in as yourself

  1. Open Customize > Connectors, at https://claude.ai/customize/connectors or from Customize in Claude Desktop's sidebar, and select + Add, then Add custom connector.
  2. Enter a name, such as Telflo, and the URL https://mcp.telflo.com/mcp, and select Continue twice.
  3. Under Authentication, choose Sign in now; under OAuth client, choose Register automatically. Select Add and finish in the browser.
  4. In a chat, turn the connector on from the + button, under Connectors.

On a Team or Enterprise plan, an Owner adds the connector under Organization settings > Connectors, and each member selects Connect on it under Customize > Connectors to sign in as themselves.

Use a service-account token

Claude sends a fixed header only through the Request headers section of Add custom connector, a beta not every organization has. Where it is available, set Authentication to No sign-in and add a required authorization header with the full value Bearer tf_.... Everyone in your Claude organization who uses the connector then acts as that one service account, so use a read-only token unless all of them should be able to push and deploy.

See Anthropic's guide to custom connectors.

Sign in as yourself

~/.cursor/mcp.json
{
  "mcpServers": {
    "telflo": {
      "url": "https://mcp.telflo.com/mcp"
    }
  }
}

Use ~/.cursor/mcp.json for every project or .cursor/mcp.json for one. With no headers, Cursor registers itself and opens the browser. Cursor desktop returns to http://localhost:8787, but when that port is busy, and in some older releases, it asks for a cursor:// link, which the Authorize page refuses with The application supplied an unsafe redirect URL.

Use a service-account token

~/.cursor/mcp.json
{
  "mcpServers": {
    "telflo": {
      "url": "https://mcp.telflo.com/mcp",
      "headers": {
        "Authorization": "Bearer ${env:TELFLO_API_TOKEN}"
      }
    }
  }
}

Cursor substitutes the variable from the environment it starts from.

See Cursor's MCP documentation.

MCP servers work in GitHub Copilot's agent mode in VS Code 1.102 or later. On Copilot Business or Enterprise, an administrator first turns on the MCP servers in Copilot policy.

Sign in as yourself

.vscode/mcp.json
{
  "servers": {
    "telflo": {
      "type": "http",
      "url": "https://mcp.telflo.com/mcp"
    }
  }
}

For your user rather than the workspace, run MCP: Open User Configuration from the Command Palette. VS Code opens the browser the first time it connects.

Use a service-account token

.vscode/mcp.json
{
  "inputs": [
    {
      "type": "promptString",
      "id": "telflo-token",
      "description": "Telflo API token (tf_...)",
      "password": true
    }
  ],
  "servers": {
    "telflo": {
      "type": "http",
      "url": "https://mcp.telflo.com/mcp",
      "headers": {
        "Authorization": "Bearer ${input:telflo-token}"
      }
    }
  }
}

VS Code asks for the token once and stores it securely. Use the input rather than ${env:TELFLO_API_TOKEN}: an open VS Code bug sends an ${env:...} header reference as literal text, which fails with a 401.

See VS Code's MCP configuration reference.

Sign in as yourself

codex mcp add telflo --url https://mcp.telflo.com/mcp

Codex detects Telflo's sign-in and opens the browser; if it asks you to, run codex mcp login telflo, which also signs in a server added to ~/.codex/config.toml by hand.

Use a service-account token

export TELFLO_API_TOKEN=tf_...
codex mcp add telflo --url https://mcp.telflo.com/mcp --bearer-token-env-var TELFLO_API_TOKEN

or in the configuration file:

~/.codex/config.toml
[mcp_servers.telflo]
url = "https://mcp.telflo.com/mcp"
bearer_token_env_var = "TELFLO_API_TOKEN"

The variable holds the token alone; Codex adds Bearer and stores only the variable's name.

See Codex's MCP documentation.

Sign in as yourself

gemini mcp add --scope user --transport http telflo https://mcp.telflo.com/mcp

--scope user writes to ~/.gemini/settings.json instead of the project's .gemini/settings.json. Gemini CLI opens the browser when it first connects, and /mcp auth telflo signs in again. The browser must run on the same machine.

Use a service-account token

~/.gemini/settings.json
{
  "mcpServers": {
    "telflo": {
      "url": "https://mcp.telflo.com/mcp",
      "type": "http",
      "headers": {
        "Authorization": "Bearer $TELFLO_API_TOKEN"
      }
    }
  }
}

Gemini CLI replaces $TELFLO_API_TOKEN from the environment when it loads its settings; an unset variable is sent as literal text.

See Gemini CLI's MCP documentation.

Windsurf is now Devin Desktop. From version 3.9.19, its agent reads MCP servers from the Devin CLI's configuration: ~/.config/devin/mcp_config.json for your user, or .devin/mcp_config.json in a project. Earlier releases, with the Cascade agent, read ~/.codeium/windsurf/mcp_config.json and use serverUrl in place of url.

Sign in as yourself

devin mcp add telflo https://mcp.telflo.com/mcp
devin mcp login telflo

Without devin mcp login, Devin asks you to sign in the first time it uses the server.

Use a service-account token

devin mcp add has no header option, so write the header into the project's local file, which Git ignores:

.devin/mcp_config.local.json
{
  "mcpServers": {
    "telflo": {
      "url": "https://mcp.telflo.com/mcp",
      "transport": "http",
      "headers": {
        "Authorization": "Bearer tf_..."
      }
    }
  }
}

See Devin's MCP configuration documentation.

ChatGPT connects only through the browser sign-in and cannot send a token. Your plan and workspace settings decide whether you can add a custom MCP server and whether its write tools can run.

  1. Go to https://chatgpt.com/plugins, select the plus button, then Add custom MCP server.
  2. Enter a name, set Server URL under Connection to https://mcp.telflo.com/mcp, and choose OAuth under Authentication.
  3. Select I understand and want to continue, then Create as a plugin, and complete the Telflo sign-in. The Authorize page shows chatgpt.com.
  4. Install the plugin from your personal plugins, and mention it with @ in a prompt.

OpenAI also documents an older developer-mode route, which an admin enables first on Business, Enterprise, and Edu workspaces.

See OpenAI's guide to adding a custom MCP server.

The MCP Inspector connects to a server and calls its tools by hand. Version 2 needs Node.js 22.19 or newer; tutorials written for version 1 show different flags.

Sign in as yourself

npx @modelcontextprotocol/inspector --server-url https://mcp.telflo.com/mcp --transport http

Open the URL the Inspector prints and select Connect. It registers itself and opens Telflo's sign-in.

Use a service-account token

export TELFLO_API_TOKEN=tf_...
npx @modelcontextprotocol/inspector --server-url https://mcp.telflo.com/mcp --transport http --header "Authorization: Bearer $TELFLO_API_TOKEN"

To list the tools without the web interface:

npx @modelcontextprotocol/inspector --cli https://mcp.telflo.com/mcp --transport http --header "Authorization: Bearer $TELFLO_API_TOKEN" --method tools/list

See the Inspector's documentation.

Sign in as yourself

A client that supports MCP authorization signs you in through your browser the first time it connects. Each client signs in separately: connecting Claude Code and Cursor means two sign-ins.

Sign in as yourself: the OAuth sequenceMCP cliente.g. Claude CodeTelflo MCP servermcp.telflo.comTelflo sign-inauthorization serverYou, in your browserthe Authorize page1POST /mcp without a token401resource_metadataa link to the server's metadata2read the server's metadata/.well-known/oauth-protected-resourceauthorization_serversTelflo sign-inscopes_supportedemail3register the clientdynamic client registrationopen your browser to sign inwith a PKCE challenge (S256)waits for the redirect4sign in, if signed outtelflo.com/oauth/consentAuthorize <client>You will be sent back to<redirect host>Only allow access if yourecognise this address.It is asking for:your email addressDenyAllow5Allowsent back with a codeto the host the page showed6exchange the codecode + code_verifieraccess token + refresh tokenrefreshed automatically7call a toolAuthorization: Bearer <token>Calls Telflo's API as you,in the organization you choosetool resultrequest or responsecode or tokenneeds you, in your browser
You visit Telflo in your browser once, at steps 4 and 5. After that the client renews its token by itself, and every tool call acts as you.

The client finds Telflo's sign-in through the server's first 401, registers itself, and opens the Authorize page in your browser. When you select Allow, the client gets a one-time code that only it can redeem (PKCE) and exchanges it for an access token and a refresh token. Every tool call then acts as you, in the organization the call resolves to.

A client that runs on your machine, such as Claude Code, Codex CLI, or Gemini CLI, receives the code at a localhost or 127.0.0.1 address, so the browser must run on that machine. On a remote or headless machine, use a service-account token, or a sign-in that prints the URL, such as claude mcp login telflo.

The Authorize page

The page is at https://telflo.com/oauth/consent. If you already allowed the same client for the same scopes, it sends you straight back without asking.

Part of the pageWhat it tells you
Authorize and the client's nameThe name the client registered under. Any application can register under any name, so it proves nothing.
You will be sent back toThe host that receives your decision, with Only allow access if you recognise this address. This is the part to check.
It is asking for:The scopes requested, such as your email address.
Signed in asThe Telflo account the client will act as.
Deny and AllowAllow sends a one-time code back to the client. Deny sends a refusal, and the client gets no access.

The host to expect for each client:

ClientYou will be sent back to
Claude Code, Gemini CLIlocalhost and a port number
Codex CLI127.0.0.1 and a port number
claude.ai, Claude Desktopclaude.ai
Cursorlocalhost:8787 from the desktop app (a cursor:// link is refused), or www.cursor.com from Cursor on the web
VS Code127.0.0.1:33418, or vscode.dev
ChatGPTchatgpt.com
MCP Inspector127.0.0.1:6274

For a client not listed, such as Devin, check the host against the client's own documentation. Select Deny if you did not start a connection, if the host does not belong to the client you are connecting, or if Signed in as shows the wrong account. To switch accounts, sign out of Telflo in that browser, which also signs out your other MCP clients, and start again from the client.

Allow lets the client call every tool as you, with your role, in any organization you belong to; the scope list does not narrow that. Access and security explains why the host matters. If the page shows Authorization link incomplete or Couldn't complete the authorization, see Troubleshooting.

Use a service-account token

A token suits an agent that runs unattended, one a team shares, or one you want to keep read-only. An organization admin creates it under Settings > Service Accounts, as described in Add a token. Use one service account per agent, so each agent's changes are attributed to it and you can cut off one agent alone. What a token can do lists its access.

A Read token can call the 14 read-only tools; a write tool fails with Not allowed (403) at the step that would change something. A Read & Write token can call all 21.

The client sends the token with every request:

Authorization: Bearer tf_...

Store the token as a secret: in an environment variable or in the client's secret prompt, as the tabs above do. Never write the value into a file you commit.

The server checks only the token's format when the client connects. A deleted, expired, or wrong token still connects and lists the tools, and the first tool call fails with Telflo rejected the token (401), so run whoami after connecting.

Choose an organization

A token always acts in its own organization. A sign-in covers every organization you belong to, including your personal workspace, so each call picks one.

How a tool call picks its organizationtf_ tokenservice accounta token is bound to one organizationThe token's organizationorg_id and X-Telflo-Org are ignoredCHECKED IN ORDER · THE FIRST ONE THAT APPLIES IS USEDSigned in as youOAuth sign-in1org_idon the tool callnot setset2X-Telflo-Orga header set in yourclient's configurationnot setset3Your only organizationif you belong toexactly one activeexactly oneThat organizationthe tool call acts in itotherwiseSeveral organizationsThe call fails and lists them by name and id.Pass org_id · ids from list_organizationsNo active organizationNot expected: every account has a personal workspace.Contact [email protected]
A token is bound to its organization. A sign-in uses the first source that applies; when none does, the call fails, and with several organizations the error lists them.

Each call uses the first of these that is set:

  1. org_id on the tool call.
  2. The X-Telflo-Org header, set in the client's configuration.
  3. Your only active organization, when you belong to exactly one.

Otherwise the call fails with the first error below. The second should not appear, since every account has a personal workspace; Troubleshooting covers both.

Pass org_id — this account belongs to several organizations: <name> (<id>), ...
Your account has no active organization. Join an organization in Telflo first.

To choose per call, tell the agent which organization to work in, by name. It calls list_organizations, which works before an organization is chosen and returns each one's id, name, type (personal or group), and your role. The agent then passes the matching id as org_id. The choice is made again on every call, so one conversation can work in two organizations.

To pin a connection to one organization, add an X-Telflo-Org header with the organization's ID to the client's configuration. In Claude Code:

claude mcp add --transport http telflo https://mcp.telflo.com/mcp --header "X-Telflo-Org: <organization id>"

In a JSON configuration, add "X-Telflo-Org": "<organization id>" to the server's headers; in Codex CLI, add http_headers = { "X-Telflo-Org" = "<organization id>" } to the server's table. The value must be an organization you are an active member of. An org_id on a call overrides the header, and a client that cannot set headers, such as claude.ai, relies on org_id.

Check the connection

Ask the agent, "Who am I in Telflo?" It calls whoami, which returns the identity behind the connection:

FieldSigned in as yourselfService-account token
kinduserservice_account
token_nameYour email addressThe token's name
org_idThe organization the call resolved toThe token's organization
grantedread and write; what you can change still depends on your roleread, or read and write
claims{"access":"write"}{"access":"read"} or {"access":"write"}

Outside an agent, call whoami from the MCP Inspector. If it fails, Troubleshooting explains each error.

Disconnect

Removing the server from a client stops that client from calling it:

ClientRemove or sign out
Claude Codeclaude mcp remove telflo. To drop only the sign-in, choose Clear authentication in /mcp.
claude.ai, Claude DesktopRemove the connector under Customize > Connectors; an organization's Owner, under Organization settings > Connectors.
Codex CLIcodex mcp logout telflo signs out. Delete the [mcp_servers.telflo] table from ~/.codex/config.toml to remove the server.
VS CodeDelete the server from mcp.json, sign out from the Accounts menu, and run Authentication: Remove Dynamic Authentication Providers.
Cursor, Gemini CLI, WindsurfDelete the telflo entry from the configuration file.
MCP InspectorClear OAuth state and disconnect.

A service-account token keeps working wherever else it is stored until you delete it. For every other way to cut off access, see Revoke access.

Continue with the tool reference and Working with an agent.

Last updated on

On this page