Connect a client
Connect Claude Code, Claude, Cursor, VS Code, the MCP Inspector or anything else to Halo's MCP server, with OAuth or a personal token.
When you're done, your client lists Halo's tools and whoami answers with your name. The server is at:
https://mcp.usehalo.net/mcpBefore you start
An Admin has to turn on Let members connect their own AI tools, and your role needs Use Halo AI. It's off by default: see Turn it on. If it's off, the server answers 403 agents_disabled, and the consent page shows why the organization can't be connected.
OAuth or a personal token
| OAuth | Personal token | |
|---|---|---|
| Good for | Apps that sign in: Claude, Cursor, VS Code, the MCP Inspector, Claude Code | Scripts, CI, and anything that only takes a header |
| What you do | Add the address, then approve in Halo. Approving needs a sign-in in the last 15 minutes, and Halo asks if yours is older | Make a token, and put it in a header |
| Credential | hmat_…, renewed by the app | hpat_…, shown once |
| Lasts | An hour at a time, for up to 90 days. Then you approve again | 7 days, 30 days, 90 days or a year |
| Made where | Halo's consent page | Halo Data, under Account, AI tools, New token. It needs a sign-in in the last 15 minutes too |
Both are one person in one organization, and neither can do more than that person. Keep a personal token out of chats, code and screenshots: anyone who has it acts as you. Examples here read it from HALO_MCP_TOKEN.
Claude Code
Add the server, then sign in from inside Claude Code:
claude mcp add --transport http halo https://mcp.usehalo.net/mcp/mcpOr use a personal token:
claude mcp add --transport http halo https://mcp.usehalo.net/mcp \
--header "Authorization: Bearer $HALO_MCP_TOKEN"To share the setup in a repository without the token, use a project's .mcp.json, which reads it from the environment:
{
"mcpServers": {
"halo": {
"type": "http",
"url": "https://mcp.usehalo.net/mcp",
"headers": { "Authorization": "Bearer ${HALO_MCP_TOKEN}" }
}
}
}Claude
Add Halo as a custom connector with the address above. On Free, Pro and Max you add it yourself (Free allows one custom connector). On Team and Enterprise an owner adds it for the organization, and then each member connects individually. Either way, you approve the connection on Halo's consent page.
Cursor
Put this in .cursor/mcp.json for a project, or ~/.cursor/mcp.json for all of them. Cursor signs in when the server asks.
{
"mcpServers": {
"halo": { "url": "https://mcp.usehalo.net/mcp" }
}
}{
"mcpServers": {
"halo": {
"url": "https://mcp.usehalo.net/mcp",
"headers": { "Authorization": "Bearer ${env:HALO_MCP_TOKEN}" }
}
}
}VS Code
Put this in .vscode/mcp.json. With no headers, VS Code signs in when the server asks.
{
"servers": {
"halo": { "type": "http", "url": "https://mcp.usehalo.net/mcp" }
}
}To use a personal token, have VS Code prompt for it and store it rather than writing it in the file:
{
"inputs": [
{ "type": "promptString", "id": "halo-token", "description": "Halo personal token", "password": true }
],
"servers": {
"halo": {
"type": "http",
"url": "https://mcp.usehalo.net/mcp",
"headers": { "Authorization": "Bearer ${input:halo-token}" }
}
}
}The MCP Inspector
The Inspector shows what the server offers, and needs a recent Node release: its README lists which. This opens it in your browser, where you can sign in with OAuth, list tools and call them:
npx @modelcontextprotocol/inspector --server-url https://mcp.usehalo.net/mcp --transport httpnpx @modelcontextprotocol/inspector --cli --server-url https://mcp.usehalo.net/mcp --transport http \
--header "Authorization: Bearer $HALO_MCP_TOKEN" \
--method tools/call --tool-name whoamiAnything else
Any client that speaks Streamable HTTP works.
It takes a header: send
Authorization: Bearer hpat_…, and read the token from the environment.It signs in: Halo follows the MCP authorization spec, so a client discovers everything from the server's
401. If you're building that yourself, see Build an OAuth client.It's a script: see The MCP protocol for raw requests, or Build an agent for TypeScript.
Tokens go in the Authorization header only. Halo refuses ?access_token= with 400.
Check it works
Ask your client to call whoami. The answer is a sentence:
You act for Dana Reyes (dana@example.com) in Acme, as Analyst. Scopes: datasets.read, data.query, content.read. This token ends 2027-02-01T15:04:05Z.| What you see | Means | What to do |
|---|---|---|
A sign-in prompt, or 401 invalid_token | No token, or it's expired, revoked, or no longer yours to use | Sign in again, or make a new token |
403 agents_disabled | The organization's Admins haven't turned on AI tools, or something has paused them | Ask an Admin. See Turn it on |
403 forbidden | Your role or membership doesn't allow it now, or your organization's plan doesn't include Halo AI | Ask an Admin |
| A tool is missing | The connection's scopes leave it out | Reconnect and allow more, or make a token with that scope |
| The consent page shows an error | The request was refused before you saw it | See the error list |
You can see and end your connections in Account, AI tools. Admins see everyone's: see See and end connections.