Connecting MCP
UTSUROI runs as an MCP (Model Context Protocol) server. Any MCP-capable AI tool — Claude Code among them — can work with your boards, tasks and comments directly.
The easy way: the official plugin
Section titled “The easy way: the official plugin”Before wiring up MCP by hand, try UTSUROI Agent Plugin. Alongside the connection settings it ships an Agent Skill that makes task workflows reliable (Apache 2.0).
| Client | Install | Invoke |
|---|---|---|
| Codex | codex plugin marketplace add Anti-Pattern-Inc/utsuroi-agent-plugincodex plugin add utsuroi-agent-plugin@utsuroi |
@UTSUROI or $utsuroi |
| Claude Code | /plugin marketplace add Anti-Pattern-Inc/utsuroi-agent-plugin/plugin install utsuroi@utsuroi |
/utsuroi:utsuroi, or automatically |
| Kiro | Powers panel → Add Custom Power → Import power from GitHub → paste the repository URL | Automatically, on task keywords |
Start a new chat after installing. Run /reload-plugins if Claude Code asks you to reload.
What follows is for connecting by hand, without the plugin.
Endpoint
Section titled “Endpoint”POST https://api.utsuroi.nil0.io/mcp- JSON-RPC over HTTP
- SSE is not supported.
GET /mcpreturns405 - The tenant (workspace) comes from the access token’s claims. No
X-Tenant-Idheader
Authentication
Section titled “Authentication”OAuth 2.1, with discovery metadata published, so a capable client only needs the URL.
| Endpoint | Purpose |
|---|---|
/.well-known/oauth-protected-resource |
Protected resource metadata (RFC 9728) |
/.well-known/oauth-authorization-server |
Authorization server metadata |
/oauth/register |
Dynamic client registration |
/oauth/authorize |
Authorization |
/oauth/token |
Issue and refresh tokens |
Token lifetimes:
| Token | Lifetime |
|---|---|
| Authorization code | 5 minutes |
| Access token | 15 minutes |
| Refresh token | 30 days |
Access tokens are stateless JWTs and cannot be revoked instantly, so they are deliberately short-lived. Capable clients refresh automatically.
Scopes
Section titled “Scopes”| Scope | Covers | Default |
|---|---|---|
mcp:tasks.read |
Read tools | yes |
mcp:tasks.write |
Write tools | yes |
mcp:boards.settings |
Board settings tools | opt-in |
mcp:boards.settings is only granted if you request it. Without it, those tools do not even appear in tools/list.
When scopes get dropped
Section titled “When scopes get dropped”Requesting a scope does not guarantee you get it.
- Viewer or guest role →
mcp:tasks.readonly - Workspace in a restricted state (over the Free limit, for example) →
mcp:tasks.readonly - Board access set to “selected boards” →
mcp:boards.settingsis never granted
If the role is the limit, changing the token’s scopes will not help. Fix the role.
Available tools
Section titled “Available tools”There are 31. See the tool reference for the full list and arguments, and AI recipes for what to actually do with them.
Some operations are deliberately not exposed:
- Physical deletion (archiving works, and archived tasks can be restored)
- Lane-wide bulk mutation
So that an AI cannot do anything irreversible.
Troubleshooting
Section titled “Troubleshooting”| Symptom | Check |
|---|---|
405 |
Are you using GET? It is POST /mcp |
| No tools at all | No scopes granted. Check the role and whether the workspace is restricted |
| No write tools | Viewer and guest roles never get them, scope request or not |
| No board settings tools | Did you request mcp:boards.settings? Not granted when board access is “selected boards” |