trackxai

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
    1. claude plugin marketplace add kalebteccom/trackxai-plugins
    2. claude plugin install trackxai@trackxai
    3. Then start Claude Code, run /mcp, pick trackxai and sign in with your browser. No token to paste.

    Token: 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.

    Claude Code MCP documentation
  • Codex

    Today
    Works with sign-in
    Plugin
    Install from GitHub
    1. codex plugin marketplace add kalebteccom/trackxai-plugins
    2. codex plugin add trackxai@trackxai
    3. Then sign in with your browser. No token to paste:

      codex mcp login trackxai

    Token: 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.

    Codex MCP documentation
  • OpenCode

    Today
    Works with sign-in
    Plugin
    Available

    Add the plugin to opencode.json. OpenCode installs it from npm at its next start:

    1. {"plugin":["@trackxai/opencode"]}
    2. Then restart OpenCode and sign in with your browser:

      opencode mcp auth trackxai

    Token: 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.

    OpenCode MCP documentation
  • Hermes Agent

    Today
    Works with sign-in
    Plugin
    Coming soon
    1. Merge this into config.yaml in your Hermes profile:

      mcp_servers:
        trackxai:
          url: "https://trackxai.kalebtec.com/mcp"
          auth: "oauth"
    2. Then sign in with your browser:

      hermes mcp login trackxai
    3. Check the connection:

      hermes mcp test trackxai

    Token: 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>.

    Hermes Agent MCP documentation
  • Pi

    Today
    Needs the plugin
    Plugin
    Available
    1. pi install npm:@trackxai/pi
    2. Pi 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
    1. 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"
          }
        }
      }
    2. Then open Agent settings, Customizations, and click Authenticate on trackxai.

    Token: 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.

    Antigravity CLI MCP documentation

The steps use the address of the hosted server, https://trackxai.kalebtec.com/mcp.

initialize

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.

.mcp.json
{
  "mcpServers": {
    "trackxai": {
      "type": "http",
      "url": "https://trackxai.kalebtec.com/mcp",
      "headers": {
        "Authorization": "Bearer ${TRACKXAI_TOKEN}"
      }
    }
  }
}
The whole client configuration for the token path. One endpoint, one header that reads the token from your environment, and a workspace token carries its workspace.

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, issued and revoked from your workspace. The plaintext appears once and is stored as a digest.

Tokens 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

Agent tokens page with the MCP configuration block, left blank in this image, and a button to copy it.
  1. Name a token for one agent session, then issue it.

The agent tokens page with a token issued

Agent tokens page scrolled to the form that issues a token and the table of issued tokens.
  1. The token shows once, right after you issue it. Copy it now.
  2. Copy the token in one click.

Connect an agent

Connect an agent page with a list of apps, the steps for the first app and a connector URL box left blank in this image.
  1. Pick the app you want to connect.
  2. Follow the steps for that app. An agent never needs to see your token.
  3. Copy the connector URL from here when the app asks for one.
  1. Pick the app you want to connect.
  2. Follow the steps for that app. An agent never needs to see your token.

The tools

The 96 tools by group
GroupTools
Readsworkspace.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
Structureproject.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
Taskstask.create, task.update, task.parent.set, task.move, task.label.set, task.archive, task.unarchive
Annotationscriterion.add, criterion.check, criterion.set, gap.add, gap.resolve, gap.reopen, gap.redirect, gap.edit, ref.add, ref.remove, comment.add
Claim lifecycletask.claim, task.release, task.reopen, task.progress, task.complete, task.park, task.unpark
Runsrun.start, run.log, run.end, run.stop, run.list, run.get
Ownership and handofftask.owner.set, task.delegate, task.handoff, presence.update
Inboxinbox.list, inbox.read
Feedbackreport.submit
Attachmentsattachment.upload, attachment.get, attachment.list, attachment.remove
Documentsdocument.create, document.get, document.update, document.list, document.link, document.unlink, document.archive, document.unarchive
isError: true

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.

ref.add

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)

A refusal for a reference whose target resolves to nothing. One part per line: the piece, the rule, an example.

The five refusal kinds

The five refusal kinds
KindWhat the caller does
rejectedA validator hard-fail. Fix the named slot and call again
invalidThe payload could not be constructed. Fix the named part
refusedThe store refused: a dangling reference, a taken slug, an absent parent
absentA read found nothing in this workspace
claimedThe task is held by another actor whose claim is live

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