The Functionize MCP server is a standard Streamable HTTP endpoint with OAuth, so any MCP-capable client can connect to it — not only Claude. This article is the reference: what the server is, what it expects, and the two ways clients reach it.
If you use Claude Code or Claude Desktop, use the dedicated guides instead. They are shorter and cover the specifics.
The server, in one table
Whatever client you are configuring, these are the values it will ask for.
| Endpoint | https://mcp.functionize.com/mcp |
| Transport | Streamable HTTP |
| Authentication | OAuth 2.0, authorization code with PKCE (S256) |
| Dynamic client registration | Supported, so most clients register themselves with no manual setup |
| Refresh tokens | Supported. offline_access is advertised and refresh_token is an
allowed grant type, so your client can stay connected without repeated sign-ins |
| Scopes | agent.sessions:read, agent.sessions:write,
offline_access |
| Optional header | X-Functionize-Team-Id: <numeric team id> to pin the connection to one
team |
| Network | Public internet over HTTPS. No VPN, no allow-listing, no manual provisioning |
You can inspect the server's own metadata at any time:
https://mcp.functionize.com/.well-known/oauth-protected-resource
https://mcp.functionize.com/.well-known/oauth-authorization-server
Two ways in
1. Native — the client speaks HTTP MCP and OAuth itself
The client connects directly, opens your browser for sign-in, and captures the response. There is nothing to install and no Node.js requirement.
This is the better path when your client supports it. Configuration is usually just a name, the URL, and a transport type.
2. Bridged — the client only speaks stdio, or cannot do OAuth
Many clients still expect a local command rather than a URL. For those, a small bridge called
mcp-remote runs locally, handles the OAuth flow, and presents the remote server as if
it were a local one.
This needs Node.js 18 or newer. Check with node --version.
npx -y mcp-remote https://mcp.functionize.com/mcp
In a client's configuration file, that usually looks like this:
{
"mcpServers": {
"functionize-hosted": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.functionize.com/mcp"]
}
}
}
On Claude Desktop and some other apps, replace "npx" with the absolute
path to your npx binary. Applications launched from the desktop do not inherit your shell,
so anything installed through nvm, fnm or Volta is invisible to them. On Windows, use the
npx.cmd file and double every backslash inside the JSON string.
Pinning a team through the bridge
{
"mcpServers": {
"functionize-hosted": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.functionize.com/mcp",
"--header", "X-Functionize-Team-Id:982"],
"env": { }
}
}
}
Replace 982 with your own team ID. Omit the header entirely to act as whichever
team your web login lands on. The server checks your membership on every request and refuses with
a 403 if you are not a member of the team you named.
Some versions of the bridge mishandle a space after the colon in a header value. If the header appears to be ignored, write it without the space as shown above, or pass the value through an environment variable.
Useful bridge options
These are occasionally needed. Most people need none of them.
--header "Name:value" | Add a custom header, such as the team ID |
--transport http-only | Force Streamable HTTP rather than letting the bridge negotiate |
--host 127.0.0.1 | Change the OAuth callback host |
--debug | Write a verbose log for support to look at |
--keep-alive | Ping periodically on flaky networks |
The bridge caches your tokens in ~/.mcp-auth on macOS and Linux, and
%USERPROFILE%\.mcp-auth on Windows. Deleting that directory forces a fresh sign-in —
it is the first thing to try if a previously working connection stops authenticating. Note that it
clears cached tokens for every bridged server, not only ours.
Signing in
Whichever route you take, you sign in with the same account you use for Functionize Studio. There is no separate MCP account and no separate password, and your existing access determines what the connection can reach.
If your organisation uses SSO, choose the SSO option rather than typing a password. If you have only ever signed in through SSO you may not have a local password at all — do not guess at one, because repeated failures can lock the account.
The sign-in page is hosted at functionize.us.auth0.com. If you are ever asked for
Functionize credentials on a different domain, do not enter them.
Checking it worked
Ask your client to list your Functionize agent sessions. If it returns your team's sessions, you are connected. The list is team-wide, so on a shared team you will see colleagues' sessions as well as your own.
Ten tools should be available: start_agent_session,
send_agent_message, get_agent_session,
get_agent_session_events, stream_agent_session_events,
list_agent_sessions, list_agent_teams,
stop_agent_session, upload_session_file and
delete_session_file.
Writing your own client
The endpoint is a standard implementation, so an MCP SDK in any language will work against it. Two things are worth knowing if you are building something custom:
The team header is read per request, not per connection. An application serving
several teams over a single MCP connection can set a different
X-Functionize-Team-Id on each request, and membership is enforced on every call. Use
list_agent_teams to enumerate the teams the signed-in user belongs to.
Interactive clients read their configuration when the connection starts, so if you change a pinned team in a config file, restart the connection for it to take effect.