Skip to main content
Glama
README.md
# pounce 🦊

An MCP server for [Targetprocess](https://www.ibm.com/products/targetprocess): lets AI
assistants read and manage your cards through the Targetprocess REST API.

Version 1.0.1. See [CHANGELOG.md](CHANGELOG.md).

## Why pounce

- **Full coverage.** If Targetprocess exposes an operation, pounce can perform it.
  Generic tools are driven by your instance's own API metadata, so custom entity
  types and future Targetprocess versions are covered automatically.
- **Tools that fit how teams work.** Workflow tools accept names instead of ids
  ("move #36400 to Coded", "assign Foxxo as Developer") and apply the team's
  rules: effort is booked per role, default assignees are cleared on creation,
  and side effects on parent cards are reported.
- **Honest results.** Every list is fully paged, every error carries
  Targetprocess's own message, and every write is read back to confirm it stuck.
- **Simple permissions.** Tools are grouped by tier, so an MCP client needs one
  rule per tier.

## Requirements

- Node.js 22.12 or newer (`npx` comes with it)
- A Targetprocess access token: in Targetprocess, open your profile →
  **Access Tokens** → create one

Nothing to download or build: your MCP client starts pounce with `npx`, which
fetches [`@redfoxxo/pounce`](https://www.npmjs.com/package/@redfoxxo/pounce) from
npm on first use. `@1` keeps you on 1.x releases.

## Configuration

pounce reads its settings from environment variables, which your MCP client
passes to it:

| Variable | Required | Purpose |
|---|---|---|
| `TP_BASE_URL` | yes | Your instance, e.g. `https://yourcompany.tpondemand.com` (no `/api/...`) |
| `TP_TOKEN` | yes | Your access token. Never logged |
| `TP_DEFAULT_PROJECT_ID` | no | Project for new cards that have no parent to inherit one from |
| `TP_DEFAULT_TEAM_ID` | no | Team for new cards when none is given |

Keep the token out of config files: export it in your shell profile
(`export TP_TOKEN=...`) and let the client pass it through, as the examples
below do.

## opencode

Add the server and the four permission rules to `opencode.json` (global:
`~/.config/opencode/opencode.json`):

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "pounce": {
      "type": "local",
      "command": ["npx", "-y", "@redfoxxo/pounce@1"],
      "enabled": true,
      "environment": {
        "TP_BASE_URL": "https://yourcompany.tpondemand.com",
        "TP_TOKEN": "{env:TP_TOKEN}"
      }
    }
  },
  "permission": {
    "pounce_read_*": "allow",
    "pounce_write_*": "ask",
    "pounce_delete_*": "ask",
    "pounce_admin_*": "deny"
  }
}
```

opencode prefixes MCP tools with the server's key, so the key must be `pounce`
for these rules to match (`read_card` becomes `pounce_read_card`). Restart
opencode after changing the file; `opencode mcp list` shows whether it connected.

## Claude Code

Register the server once for all your projects. `${TP_TOKEN}` is read from your
environment when the server starts, so the token is not stored in the config:

```sh
claude mcp add-json pounce --scope user '{
  "type": "stdio",
  "command": "npx",
  "args": ["-y", "@redfoxxo/pounce@1"],
  "env": {
    "TP_BASE_URL": "https://yourcompany.tpondemand.com",
    "TP_TOKEN": "${TP_TOKEN}"
  }
}'
```

Then add the four permission rules to `~/.claude/settings.json`:

```json
{
  "permissions": {
    "allow": ["mcp__pounce__read_*"],
    "ask": ["mcp__pounce__write_*", "mcp__pounce__delete_*"],
    "deny": ["mcp__pounce__admin_*"]
  }
}
```

Claude Code names MCP tools `mcp__<server>__<tool>`, so the server name must be
`pounce` for these rules to match. Check the connection with
`claude mcp get pounce`, or `/mcp` inside a session.

## Other MCP clients

Any client that starts local (stdio) servers works. Most accept an
`mcpServers` block like this one (Claude Desktop, Cursor, ...):

```json
{
  "mcpServers": {
    "pounce": {
      "command": "npx",
      "args": ["-y", "@redfoxxo/pounce@1"],
      "env": {
        "TP_BASE_URL": "https://yourcompany.tpondemand.com",
        "TP_TOKEN": "your-access-token"
      }
    }
  }
}
```

Then map the four tool-name prefixes below to the client's permission system.

## Permission tiers

Every tool name starts with its tier, so one rule per tier covers all tools,
including ones added in later versions:

| Prefix | What it does | Suggested rule |
|---|---|---|
| `read_` | Reads only | allow |
| `write_` | Creates and updates cards, comments, time, relations, ... | ask |
| `delete_` | Deletes | ask |
| `admin_` | Changes configuration (projects, teams, users, processes, workflows, ...); needs an administrator token | deny |

## Tools

58 tools. Workflow tools are the ones to use day to day. Generic tools are the
escape hatch that reaches every resource and operation your instance reports.

**read** (26)

- Workflow: `read_card`, `read_search`, `read_my_work`, `read_states`,
  `read_people`, `read_teams`, `read_roles`, `read_projects`, `read_releases`,
  `read_iterations`, `read_custom_field_options`, `read_comments`,
  `read_relations`, `read_times`, `read_attachments`, `read_test_plan`
- Generic: `read_meta`, `read_get`, `read_query`, `read_collection`,
  `read_v2_query`, `read_history`, `read_context`, `read_conversions`,
  `read_deleted`, `read_storage`

**write** (20)

- Workflow: `write_create_card`, `write_update_card`, `write_set_state`,
  `write_assign`, `write_unassign`, `write_set_role_effort`,
  `write_set_custom_fields`, `write_team`, `write_comment`, `write_log_time`,
  `write_relate`, `write_follow`, `write_test_cases`, `write_test_run`
- Generic: `write_create`, `write_update`, `write_bulk`,
  `write_collection_add`, `write_storage`, `write_attachment`

**delete** (6): `delete_card`, `delete_relation`, `delete_entity`, `delete_bulk`,
`delete_collection_remove`, `delete_storage`

**admin** (6): `admin_create`, `admin_update`, `admin_delete`,
`admin_collection_add`, `admin_collection_remove`, `admin_undelete`

### Rules the workflow tools enforce

- Effort belongs to a role. `write_set_role_effort` writes role effort rows; the
  card total is computed by Targetprocess and is never written directly.
- Changing a task's role effort makes Targetprocess recalculate its user story;
  the story's before/after values are reported.
- Cards created with `write_create_card` lose the assignments Targetprocess adds
  by default, including ones it adds a moment later, and get exactly the people
  you asked for. What was removed is reported. On existing cards nobody is
  removed unless you ask (`exclusive`).
- State changes and new children report the parent card's state before and after.
- New cards inherit the parent's project. If no project can be resolved, nothing
  is sent.
- Names are resolved, never guessed: an ambiguous name returns every candidate
  with its id.
- Time is logged where your process keeps it: standard Time entries, or, on
  instances that track time in a custom `TimeRecord` type (hours and date fields),
  a time record linked to the person and the card.
- Descriptions and comments can be written as Markdown (`format: "markdown"`),
  HTML or plain text, and are read back as Markdown either way.
- Every write is read back, and any value that did not persist is listed under
  `notPersisted`. If a multi-step write fails partway, the error says what was
  already done.

### Known limitations

- Downloading attachments is not supported. With an access token, Targetprocess
  returns an HTML page instead of the file.
- Automation rules, validation rules, mashups and CSV import have no REST
  management API and are out of scope.

## Development

Building from source, running the tests and releasing are described in
[DEVELOPMENT.md](DEVELOPMENT.md).

## License

[MIT](LICENSE)

TDQS

A3.5/5.0

Scored across 58 tools

Disambiguation4/5

Most tools have clearly distinct purposes, with detailed descriptions that disambiguate card-specific operations from generic ones (e.g., read_card vs read_get, write_create_card vs write_create). Some potential confusion exists between read_query and read_v2_query, and between write_update_card and write_update, but descriptions explicitly guide selection.

Naming Consistency4/5

All tool names follow a consistent prefix_verb_noun snake_case pattern (read_*, write_*, delete_*, admin_*), making the set predictable. Minor deviations like write_team, write_follow, and write_relate use verbs instead of nouns, but the overall convention is strong.

Tool Count1/5

With 58 tools, the server exceeds the 50+ threshold defined as an extreme mismatch. While tools are organized by operation type and cover a comprehensive API, the sheer number overwhelms agents and raises misselection risk. Generic CRUD and admin tools could be consolidated.

Completeness4/5

The tool surface covers the bulk of Targetprocess card workflows, including create/read/update/delete for cards, relations, custom fields, comments, attachments, and test runs. Notable gaps include no write/delete for releases and iterations, no comment deletion, and no attachment removal, but these are minor relative to the breadth covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues