6.6 KiB
Vikunja access — agent onboarding prompt
Hand the block below to any agent that needs Vikunja access. It is written to be
pasted verbatim as a task prompt. Everything after the --- is the prompt.
Before pasting, substitute:
<AGENT_NAME>— the bot account for this harness, e.g.bot-nullclaw<HARNESS>—claude-code,omp,picocode, orother
Task: configure your own Vikunja access
You are <AGENT_NAME>. Give yourself working access to Vikunja at
https://todo.dominat.us, then verify it and report what you can and cannot see.
Facts you need
-
The tooling is a public repo. Clone it on whatever machine you run on — no credentials needed, and standard-library Python only, so there is nothing to install:
git clone https://git.dominat.us/oc/vikunja-agents.git ~/opt/vikunja-agents mkdir -p ~/.local/bin && ln -sf ~/opt/vikunja-agents/vk ~/.local/bin/vkIt gives you
vk(CLI),vikunja_mcp.py(MCP server, stdio) andvkclient.py(shared client). To update later:git -C ~/opt/vikunja-agents pull. -
On
reptarit is already checked out at/srv/pods/vikunja-agents/; use that path instead of cloning again. -
Auth is a Vikunja API token, read from
~/.config/vikunja-agents/config.json(mode 0600) or$VIKUNJA_TOKEN. Select an identity with$VIKUNJA_PROFILE. -
Your account must already exist. The normal shape is a bot user: a local account owned by a human, with no password of its own. If it does not exist, stop and ask — creating one is your owner's job (Vikunja UI: Settings → Bot Users). MAS/OIDC accounts cannot be used for this (see constraints).
Step 1 — get your token (once)
If your account is a bot user (the normal case — it has an owner and no password), you cannot mint your own token: token creation needs a password login and bots have none. Your owner mints it for you, then hands it over out of band. Store it without putting it in argv or shell history:
vk profile <AGENT_NAME> --username <AGENT_NAME> < /path/to/token-file
# or: pbpaste | vk profile <AGENT_NAME> --username <AGENT_NAME>
vk profile verifies the token against the API before saving, so a bad paste
fails loudly instead of silently writing a dead profile. It lands in
~/.config/vikunja-agents/config.json at mode 0600.
If you have no token, stop and ask your owner for one. They create it from
Vikunja's UI (Settings → API tokens, issued for your bot) or with an
authenticated PUT /api/v1/tokens carrying owner_id: <your user id>.
If your account is instead a plain user with a password (legacy), you can mint your own:
VIKUNJA_PASSWORD="$(cat ~/.config/vikunja-agents/<AGENT_NAME>.password)" \
vk bootstrap --username <AGENT_NAME> --title "<HARNESS> ($(hostname))"
Either way: never echo the token, paste it into a chat, or commit it. It expires in a year and cannot renew itself — renewal means asking your owner again.
Step 2 — register the MCP server for your harness
claude-code:
claude mcp add vikunja -e VIKUNJA_PROFILE=<AGENT_NAME> -- /srv/pods/vikunja-agents/vikunja_mcp.py
omp — add to ~/.omp/agent/mcp.json (create it if absent):
{
"mcpServers": {
"vikunja": {
"type": "stdio",
"command": "/srv/pods/vikunja-agents/vikunja_mcp.py",
"env": { "VIKUNJA_PROFILE": "<AGENT_NAME>" }
}
}
}
picocode — add to picocode.yaml:
mcp:
vikunja:
command: /srv/pods/vikunja-agents/vikunja_mcp.py
env:
VIKUNJA_PROFILE: <AGENT_NAME>
auto_allow:
- "^vikunja_list_"
- "^vikunja_get_"
other — the server speaks MCP over stdio (JSON-RPC 2.0, newline-delimited).
Run vikunja_mcp.py with VIKUNJA_PROFILE set.
In every snippet above, use /srv/pods/vikunja-agents/vikunja_mcp.py on reptar
and ~/opt/vikunja-agents/vikunja_mcp.py wherever you cloned it. If your
harness cannot speak MCP, skip this step and use the vk CLI instead; it covers
the same ground.
Step 3 — verify, and do not skip this
vk whoami # must print <AGENT_NAME>
vk projects # the projects you can actually see
vk tasks --mine # your queue
Then confirm the MCP path independently of the CLI — restart your harness if it
binds MCP servers at startup (claude-code does), and call vikunja_list_projects.
If the tool is missing, the registration did not take; if it errors, the token
did not take. These are different failures — do not report one as the other.
Step 4 — report
State plainly:
- Which projects you can see (likely only your own
Inbox— see constraints). - Whether MCP tools are available, or whether you fell back to the CLI.
- Anything you had to ask a human for.
Constraints that will otherwise cost you an hour
- A token cannot mint another token. Vikunja excludes the
tokensroute group from anything an API token can be granted. For a bot user that means only your owner can issue or renew your token; you can never do it yourself, and there is no password you could use even if you wanted to. - You cannot ask the API who you are.
/useris unreachable with a token (user_*routes are excluded too).vk whoamireads the username from your config file. Do not try to fix a 401 on/user— it is expected. - You start with only your own Inbox. A new account sees nothing else until a
human shares projects with it. If
vk projectsshows one project, that is normal, not a broken token — say so and ask for the shares you need. - Assignment is dispatch. Work reaches you by being assigned to
<AGENT_NAME>. Usevk tasks --mine. Do not scrape other agents' queues. - Username lookup is project-scoped. Resolving a username to an id uses
/projects/{id}/projectusers; the instance-wide/userssearch is not grantable to tokens. You can only assign to users who can access that project. - Updates replace the whole task. The client merges for you; if you call the API directly, read-modify-write or you will blank fields.
- Link your work back. Put
VK-<task id>in commit messages, andfixes VK-<id>to close a task on push — a Gitea bridge posts the commit link onto the task. Without it a task says "done" but never says what changed.
Rules
- One account per harness. Do not share a profile with another agent — separate accounts are what make the task history say who did what.
- Never print, log, or transmit the token or password. If you think one leaked, say so immediately; rotation needs a human.
- Comment on tasks when you finish work, find something that changes scope, or are blocked. Do not narrate routine steps.