TeamFlow in JetBrains AI Assistant
IntelliJ IDEA, PyCharm, WebStorm and the rest register MCP servers through Settings rather than a file. Junie, JetBrains' agent, uses a file and loads Agent Skills, and that is what the installer writes.
Tool JetBrains AI Assistant Reporting Automatic, via hooks
1. Install
npx -y github:macleodlabs-ai/teamflow-plugin skills install --for jetbrains
That writes:
.agents/skills/<skill>/SKILL.md— the ten skills, in the shared skills directory this tool readsAGENTS.md— the always-on reporting instruction, as a marked block; your own instructions above and below it are kept.junie/mcp/mcp.json— Junie's MCP config~/.junie/teamflow-hook.sh— the hook itself; it callsteamflow hook --for jetbrains, prints nothing the tool could read as a denial, and exits 0 whatever happens~/.junie/config.json— the hook registration:PreToolUseandStop
Add --scope user to install for every project on this machine, or --dry-run to see the file list without writing anything. Re-running it replaces TeamFlow's block and leaves the rest of each file alone.
2. The skills you get
The same ten the Claude Code plugin carries, generated from the same SKILL.md files. This tool loads them as skills, one directory each, with the name prefixed so they do not collide with anybody else’s in a shared directory.
| Skill | What it does |
|---|---|
teamflow-login / teamflow-logout | sign in once, or remove the session |
teamflow-status | who is signed in, what is bound, what was last sent |
teamflow-bind / teamflow-unbind | name the ticket by hand, or stop |
teamflow-sync | publish the current state now |
teamflow-doctor | transport, account, credits, tracker MCP |
teamflow-repos | register a repository so its CI can report |
teamflow-admin-code | email an invite code to an org admin; superadmins only |
macleodlabs-teamflow-client | call the paid service over MCP or REST |
Each one wraps a github:macleodlabs-ai/teamflow-plugin subcommand, so the skill and the shell command are the same thing. Inside Claude Code they are /teamflow:login, /teamflow:status and so on.
3. Sign in once
This is the one gap on this page. JetBrains documents headers for MCP authentication and says nothing about OAuth, and there is an open request for OAuth 2.1 support on their tracker. Recent builds do appear to follow OAuth discovery and register dynamically when a server answers 401, but that behaviour is undocumented and may not be in your version.
If the server will not authenticate, bridge it over stdio instead:
{
"mcpServers": {
"teamflow": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://codercat.io/mcp"]
}
}
}
mcp-remote runs the browser flow itself and caches the token under ~/.mcp-auth. It is a workaround, not the intended path, and worth retrying the plain url form after an IDE upgrade.
4. By hand
The installer writes this for you. If you would rather paste it: Settings -> Tools -> AI Assistant -> Model Context Protocol (MCP) for AI Assistant. For Junie the installer writes .junie/mcp/mcp.json.
{
"mcpServers": {
"teamflow": {
"url": "https://codercat.io/mcp"
}
}
}
AI Assistant's settings dialog accepts this JSON pasted whole. Typing / in the chat and choosing to add a command reaches the same place.
Junie reads both .junie/skills and the shared .agents/skills root; the installer writes the shared one. AI Assistant's own IDE-wide skill storage has no documented path, so nothing is guessed for it.
A JetBrains run configuration is often the better reporter here: point a shell configuration at npx -y github:macleodlabs-ai/teamflow-plugin report and it fires whenever the developer runs the tests, with no model in the loop and no OAuth question.
5. The stages to report
| Stage | When |
|---|---|
LOCAL_DEV | code is being written on a workstation |
LOCAL_TEST | the local test suite or build passed |
LOCAL_AUDIT | a local review, lint or security audit passed |
LOCAL_REWORK | a local gate failed; pass --rework-from naming it |
MERGE | the pull request is merged, or ready to be |
CI_BUILD | CI is building the merged change |
DEPLOY_DEV | the change is deployed to the shared dev environment |
DEV_TEST | tests passed against dev |
DEV_AUDIT | an audit passed against dev |
DEV_REWORK | a dev gate failed; pass --rework-from naming it |
DEV_VERIFIED | verified in dev |
READY_PROD | waiting on the production decision |
JIRA is the thirteenth: the ticket exists and nothing has started. Statuses are running, success, waiting, blocked, failed and idle. This is the same vocabulary the Claude Code plugin derives, so a ticket moved from here sits in the same column as one moved by Claude.
6. Without the agent
Anything that runs in a shell posts the same report with no model involved. A git hook, an npm script, a run configuration, a CI step:
npx -y github:macleodlabs-ai/teamflow-plugin report --issue DAEMON-142 --stage LOCAL_TEST \
--status success --summary "42 tests, 0 failing"
Same envelope, same transport, same credential. Prefer it wherever the board has to be right whether or not an agent remembered. npx -y github:macleodlabs-ai/teamflow-plugin report --help lists every flag.
7. What this is not
JetBrains Junie reports automatically through its own hooks: PreToolUse and Stop. Nothing to remember. Junie CLI fires before a tool call and never after one, so edits report as work in progress and the test and audit gates need the git fallback. Junie also reads only ~/.junie/config.json; a project config is ignored unless Junie is passed --config-location.
The hooks see this tool's own calls and nothing else. A test run in another terminal, a merge from the web UI, a deploy from a pipeline: put npx -y github:macleodlabs-ai/teamflow-plugin report in the git hook or the script that already runs on every change, and those land on the board too.
8. What leaves your machine
TeamFlow is a delivery map for Jira, Linear and GitHub issues, run by MacleodLabs. Reports carry derived state only: a ticket key, a stage, a status, a short summary and evidence links. Prompts, diffs, source code, commands and logs are never sent and are rejected before they are charged.