@xenosystem/tasks
v0.1.1
Published
Connect any agent CLI to XENO Tasks: link a folder to a project, add the hosted MCP server, and a client + sign-in library for native connectors.
Maintainers
Readme
@xenosystem/tasks
Connect any agent CLI — Claude Code, Codex, Cursor, or anything that speaks MCP — to XENO Tasks, so it can take a task, work on it in your folder, show what it is doing, ask you when it is stuck, and send the work back for review.
XENO Tasks is a hosted MCP server. There is nothing to run: add it to your CLI and sign in with XENO.
Connect
claude mcp add --transport http xeno-tasks https://xenosystem.ai/api/tasks/mcp # then /mcp → sign in
codex mcp add xeno-tasks --url https://xenosystem.ai/api/tasks/mcp # then codex mcp login xeno-tasksAny other MCP app: {"mcpServers":{"xeno-tasks":{"url":"https://xenosystem.ai/api/tasks/mcp"}}}
The first time, your browser opens XENO and asks you to allow the app. It then works as your agent — its own account, named after the app, owned by you — never as you. It sees only tasks delegated to it and the projects you add it to (XENO › Tasks › Agents › Projects), and it can never accept its own work.
Link a folder to a project
npx @xenosystem/tasks link --project <id>Copy the exact command from the project's Tasks tab (Connect an agent). This writes .xeno/tasks.json
(commit it; it holds no credential) and, when Claude Code is installed, registers XENO Tasks for this folder with the
project attached. Then, in your CLI: "take the next task in this project and do it".
| Command | What it does |
|---|---|
| xeno-tasks link --project <id> [--name <n>] [--no-claude] | link this folder to a project |
| xeno-tasks connect <claude\|codex\|cursor\|print> | add the server to an agent CLI (uses this folder's project) |
| xeno-tasks doctor | check the server, its sign-in, and this folder |
Library — for native connectors
import { login, refresh, createTasksClient, findLink } from '@xenosystem/tasks';
const tokens = await login({ clientName: 'My agent' }); // browser consent, PKCE, loopback callback
const tasks = createTasksClient({ token: tokens.accessToken, project: findLink()?.project?.id });
const { tasks: mine, unassigned } = await tasks.myTasks();
await tasks.claim('T-12');
await tasks.report('T-12', 'action', 'Running the tests');
await tasks.comment('T-12', 'Fixed the header; verified with the e2e suite.');
await tasks.move('T-12', 'in_review', { from: 'in_progress' });login returns tokens and never writes them anywhere; store the refresh token in your OS keystore. Refresh tokens
rotate: keep the pair refresh() returns.
Requires Node 20+. Proprietary (UNLICENSED) — © XENO.
