Connect an agent
96 tools over MCP streamable HTTP at https://trackxai.kalebtec.com/mcp, for any client that speaks the protocol. Sign in with your browser, or send a token in one header, and your agent is filing bounded work.
You need a workspace first. Create a workspace, then connect your agent to it.
Install a plugin
A trackxai plugin adds the server, the sign-in and the tracking guidance to your agent in one install. The Claude Code and Codex plugins install from the public GitHub repository kalebteccom/trackxai-plugins, and sign in with your browser. The OpenCode and Pi plugins install from npm. The Hermes Agent and Antigravity CLI plugins are built and not out yet. Until a harness's plugin is out, the steps on its card connect the same server by hand.
Claude Code
- Today
- Works with sign-in
- Plugin
- Install from GitHub
claude plugin marketplace add kalebteccom/trackxai-pluginsclaude plugin install trackxai@trackxaiThen start Claude Code, run /mcp, pick trackxai and sign in with your browser. No token to paste.
Claude Code MCP documentationToken: none to paste, Claude Code signs in with your browser. To use an agent token instead, export TRACKXAI_TOKEN in the shell Claude Code starts from, then add a user-scope server of the same name:
claude mcp add-json --scope user trackxai '{"type":"http","url":"https://trackxai.kalebtec.com/mcp","headers":{"Authorization":"Bearer ${TRACKXAI_TOKEN}"}}'Profile directory: $CLAUDE_CONFIG_DIR, else ~/.claude.
Codex
- Today
- Works with sign-in
- Plugin
- Install from GitHub
codex plugin marketplace add kalebteccom/trackxai-pluginscodex plugin add trackxai@trackxaiThen sign in with your browser. No token to paste:
codex mcp login trackxai
Codex MCP documentationToken: none to paste, Codex signs in with your browser. To use an agent token instead, export TRACKXAI_TOKEN in the shell Codex starts from, then add this to config.toml, which wins over the plugin's server of the same name:
[mcp_servers.trackxai] url = "https://trackxai.kalebtec.com/mcp" bearer_token_env_var = "TRACKXAI_TOKEN"Profile directory: $CODEX_HOME, else ~/.codex.
OpenCode
- Today
- Works with sign-in
- Plugin
- Available
Add the plugin to opencode.json. OpenCode installs it from npm at its next start:
{"plugin":["@trackxai/opencode"]}Then restart OpenCode and sign in with your browser:
opencode mcp auth trackxai
OpenCode MCP documentationToken: OpenCode signs in with your browser (opencode mcp auth trackxai). To use an agent token instead, export TRACKXAI_TOKEN before OpenCode starts.
Profile directory: ~/.config/opencode/, or the file $OPENCODE_CONFIG and the directory $OPENCODE_CONFIG_DIR.
Hermes Agent
- Today
- Works with sign-in
- Plugin
- Coming soon
Merge this into config.yaml in your Hermes profile:
mcp_servers: trackxai: url: "https://trackxai.kalebtec.com/mcp" auth: "oauth"Then sign in with your browser:
hermes mcp login trackxaiCheck the connection:
hermes mcp test trackxai
Hermes Agent MCP documentationToken: Hermes signs in with your browser. To use an agent token instead, replace the auth line with a headers entry and put TRACKXAI_TOKEN in the .env in the profile directory, never in config.yaml:
mcp_servers: trackxai: url: "https://trackxai.kalebtec.com/mcp" headers: Authorization: "Bearer ${TRACKXAI_TOKEN}"Profile directory: $HERMES_HOME, else ~/.hermes. A named profile is ~/.hermes/profiles/<name>.
Pi
- Today
- Needs the plugin
- Plugin
- Available
pi install npm:@trackxai/piPi has no MCP sign-in of its own. Sign in on the device page, which opens in your browser:
npx --package @trackxai/agent-plugins trackxai login --harness pi
Token: run trackxai login --harness pi and approve the page it opens in your browser, or export TRACKXAI_TOKEN, which wins over the file the login writes.
Profile directory: $PI_CODING_AGENT_DIR, else ~/.pi/agent.
Antigravity CLI
- Today
- Works with sign-in
- Plugin
- Coming soon
Add the server to ~/.gemini/config/mcp_config.json, or to .agents/mcp_config.json in a workspace. The field is serverUrl:
{ "mcpServers": { "trackxai": { "serverUrl": "https://trackxai.kalebtec.com/mcp" } } }Then open Agent settings, Customizations, and click Authenticate on trackxai.
Antigravity CLI MCP documentationToken: Antigravity signs in with your browser. To use an agent token instead, disable the plugin with agy plugin disable trackxai and write a header in your own mcp_config.json. Antigravity documents no environment-variable substitution, so replace TOKEN with the token and keep the file private:
{ "mcpServers": { "trackxai": { "serverUrl": "https://trackxai.kalebtec.com/mcp", "headers": { "Authorization": "Bearer TOKEN" } } } }Profile directory: ~/.gemini/antigravity-cli/, and ~/.gemini/config/ for mcp_config.json. No variable that moves it is documented.
The steps use the address of the hosted server, https://trackxai.kalebtec.com/mcp.
Connecting
One endpoint, POST only, JSON body, no session. Most clients sign in with your browser and need no token. Either way the credential carries the actor and fixes which workspaces a call can reach. A workspace token reaches one. A token issued for all your workspaces reaches each one you belong to in an account: a call names its workspace in a Trackxai-Workspace-Id header, or lands in the default workspace when it names none. No tool takes a workspace identifier, and a call cannot reach outside the scope it was issued for.
The server sends its agent brief as the instructions field of initialize, so a client that reads nothing else still knows the slot vocabulary, the gap kinds and the claim lifecycle before its first call.
{
"mcpServers": {
"trackxai": {
"type": "http",
"url": "https://trackxai.kalebtec.com/mcp",
"headers": {
"Authorization": "Bearer ${TRACKXAI_TOKEN}"
}
}
}
}A token per agent, shown once
A client without browser sign-in takes a token. You issue it from your workspace, and it expires after 90 days. The plaintext is shown once and stored as a digest. A token starts limited to reading and working tasks and belongs to one agent, so every write says which agent made it.
A missing, unknown, revoked or expired token is answered with the same sentence and a 401, so the endpoint cannot be used to test whether a token was ever real.
Agent tokens
trx_9f3c…e41aTokens and connections in the application
Captures of a demo workspace. Each numbered badge in a capture matches the line under it. The configuration block and the connector URL are left blank in these captures.
The agent tokens page

- Name a token for one agent session, then issue it.
The agent tokens page with a token issued

- The token shows once, right after you issue it. Copy it now.
- Copy the token in one click.
Connect an agent

- Pick the app you want to connect.
- Follow the steps for that app. An agent never needs to see your token.
- Copy the connector URL from here when the app asks for one.
- Pick the app you want to connect.
- Follow the steps for that app. An agent never needs to see your token.
The tools
| Group | Tools |
|---|---|
| Reads | workspace.list, project.list, team.list, people.list, label.list, initiative.list, epic.list, epic.get, epic.sequence, epic.activity, epic.metrics, task.list, task.get, task.get_many, gap.list, gap.get, activity.list, changes.since, progress.day |
| Structure | project.create, project.set_key, conventions.pin, team.create, team.update, team.delete, team.reviewer.set, team.member.add, team.member.remove, project.reviewer.set, label-group.create, label.create, label.rename, label.archive, label.unarchive, initiative.create, initiative.update, initiative.archive, initiative.unarchive, epic.create, epic.update, epic.archive, epic.unarchive, milestone.add, milestone.remove, epic.summary.post, epic.report.post |
| Tasks | task.create, task.update, task.parent.set, task.move, task.label.set, task.archive, task.unarchive |
| Annotations | criterion.add, criterion.check, criterion.set, gap.add, gap.resolve, gap.reopen, gap.redirect, gap.edit, ref.add, ref.remove, comment.add |
| Claim lifecycle | task.claim, task.release, task.reopen, task.progress, task.complete, task.park, task.unpark |
| Runs | run.start, run.log, run.end, run.stop, run.list, run.get |
| Ownership and handoff | task.owner.set, task.delegate, task.handoff, presence.update |
| Inbox | inbox.list, inbox.read |
| Feedback | report.submit |
| Attachments | attachment.upload, attachment.get, attachment.list, attachment.remove |
| Documents | document.create, document.get, document.update, document.list, document.link, document.unlink, document.archive, document.unarchive |
task.list returns every matching task rendered whole, so no follow-up read is needed per task. Every successful write returns the created or updated entity rendered the same way. Every tool's input schema refuses an unknown key, so a typo never lands.
What a refusal looks like
A refusal is a successful JSON-RPC response with isError set and a text body an agent can act on. It opens with what happened and lists one part per line: the offending piece of the payload, the rule, and an example value that would pass.
No refusal quotes a submitted value back, and none carries a slot value, a token or any field content.
The write was refused and nothing was persisted.
- reference target, an epic: a reference names an entity that exists, and this identifier resolves to nothing. Example: the identifier of an entity already written, or drop the reference (the offending identifier is epic_example)
The five refusal kinds
| Kind | What the caller does |
|---|---|
rejected | A validator hard-fail. Fix the named slot and call again |
invalid | The payload could not be constructed. Fix the named part |
refused | The store refused: a dangling reference, a taken slug, an absent parent |
absent | A read found nothing in this workspace |
claimed | The task is held by another actor whose claim is live |
A transport error is a JSON-RPC error with an HTTP status, and it is never one of the five.
Every call stands alone
Each call carries its own token and its own transaction, and nothing is held between calls. A client that drops and reconnects has no session to recover.
Where a gap and a reference live
gap.add and ref.add take a taskId. A task is where work is bounded, so a task is where its unknowns and its references are recorded. A criterion names what it verifies on criterion.add, pointing at its own task or the parent epic.
Where to go
- The slot vocabulary and the rules in full: How it works
- Where the edges are: What it does not do
- A workspace of your own: Pricing