trac-mcp-serverBLOCK
A MCP (Model Context Protocol) server that provides AI assistants with tools to interact with Trac project management instances — managing tickets, wiki pages, and milestones
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
Standalone MCP server that gives AI agents full access to Trac project management -- tickets, wiki, milestones, and search -- via the Model Context Protocol.
Quick Start
Requires Python 3.10 or later.
pip install .
Set your Trac connection:
export TRAC_URL="https://trac.example.com" export TRAC_USERNAME="your-username" export TRAC_PASSWORD="your-password"
Run the server:
trac-mcp-server
Using auto-pm? When trac-mcp-server is driven through auto-pm, auto-pm reads its connection settings from.auto_pm/config.ymlin your project root (rather than the environment variables above). Runauto-pm setupin your project directory to generate the file; the resulting.auto_pm/config.ymlcarriestrac.url,trac.username, a${TRAC_PASSWORD}reference, and component mappings.
Configuration
Configuration via environment variables, .env file, or YAML config file (.trac_mcp/config.yaml):
e3af4997ffc7OBSERVED · 2026-10-11Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add trac-mcp-server --env TRAC_MCP_AUTH_TOKEN=${TRAC_MCP_AUTH_TOKEN} --env TRAC_PASSWORD=${TRAC_PASSWORD} --env TRAC_PASSWORD_2=${TRAC_PASSWORD_2} -- uvx trac-mcp-server{
"mcpServers": {
"trac-mcp-server": {
"command": "uvx",
"args": [
"trac-mcp-server"
],
"env": {
"TRAC_MCP_AUTH_TOKEN": "${TRAC_MCP_AUTH_TOKEN}",
"TRAC_PASSWORD": "${TRAC_PASSWORD}",
"TRAC_PASSWORD_2": "${TRAC_PASSWORD_2}"
}
}
}
}Exposed tools (25)
14 read · 7 write · 4 destructive. Blast radius: 4 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
get_server_time | read | Get current Trac server time for temporal reasoning and coordination. Returns server timestamp in both ISO 8601 and Unix timestamp formats. |
milestone_create | write | Create a new milestone. Requires TICKET_ADMIN permission. Attributes: due (ISO 8601 date), completed (ISO 8601 date or 0), description (string). |
milestone_delete | destructive | Delete a milestone by name. Requires TICKET_ADMIN permission. Warning: This cannot be undone. |
milestone_get | read | Get milestone details by name. Returns name, due date, completion date, and description as stored: TracWiki, byte-for-byte. Requires TICKET_VIEW permission. |
milestone_list | read | List all milestone names. Returns array of milestone names (e.g., [ |
milestone_update | write | Update an existing milestone. Requires TICKET_ADMIN permission. Attributes: due (ISO 8601 date), completed (ISO 8601 date or 0), description (string). |
ping | read | Test Trac MCP server connectivity and return API version |
ticket_actions | read | Get valid workflow actions for a ticket |
ticket_attachment_list | read | List attachments on a Trac ticket. |
ticket_batch_create | write | Create multiple tickets in a single batch operation. Best-effort: all items attempted, per-item results reported. Bounded by TRAC_MAX_PARALLEL_REQUESTS semaphore. Descriptions are TracWiki and are stored byte-for-byte. |
ticket_batch_delete | destructive | Delete multiple tickets in a single batch operation. Best-effort: all items attempted, per-item results reported. Requires TICKET_ADMIN permission. |
ticket_batch_update | write | Update multiple tickets in a single batch operation. Best-effort: all items attempted, per-item results reported. Comments are TracWiki and are stored byte-for-byte. |
ticket_changelog | read | Get ticket change history. Use this to investigate who changed what and when. Comment content is returned as stored: TracWiki, byte-for-byte. |
ticket_create | write | Create a new ticket. The description is TracWiki and is stored byte-for-byte -- nothing is converted, so hand-authored markup survives exactly as written. |
ticket_delete | destructive | Delete a ticket permanently. Warning: This cannot be undone. Requires TICKET_ADMIN permission and |
ticket_fields | read | Get all ticket field definitions (standard + custom fields). Returns field metadata including name, type, label, options (for select fields), and custom flag. Use to discover instance-specific ticket schema. |
ticket_search | read | Search tickets with filtering by status, owner, and keywords. Returns ticket IDs with summaries. |
whoami | read | Return the in-flight request |
wiki_create | write | Create a new wiki page. Content is TracWiki and is stored byte-for-byte -- nothing is converted, so hand-authored markup survives exactly as written. Fails if the page exists (use wiki_update instead). |
wiki_delete | destructive | Delete a wiki page. Warning: This cannot be undone. Requires WIKI_DELETE permission. |
wiki_get | read | Get wiki page content as stored: TracWiki, byte-for-byte. Returns full content with metadata (version, author, modified date). |
wiki_get_history | read | Get wiki page revision history newest-first. Returns list of revisions with version, author, lastModified, and comment (commit message). Useful for detecting prior edits or scanning attribution markers in change comments. |
wiki_recent_changes | read | Get recently modified wiki pages. Returns pages sorted by modification date (newest first). Useful for finding stale or recently updated documentation. |
wiki_search | read | Search wiki pages by content with relevance ranking. Returns snippets showing matched text, as stored: TracWiki, byte-for-byte. |
wiki_update | write | Update an existing wiki page with optimistic locking (requires version for conflict detection). Content is TracWiki and is stored byte-for-byte -- nothing is converted, so hand-authored markup survives exactly as written. |
Trust audit
BLOCKgrade D · trust 63/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | FAIL |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (1 observation(s))
- Network
- declared (10 observation(s))
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (25)
server_args.append("--insecure")"--insecure",
"--insecure",
<a class="ext-link" href="http://192.168.10.4:8000/auto_pm/intertrac/wiki%3ARules/trac/RenderVerify" title="wiki:Rules/trac/RenderVerify in Automated Project Manager"><span class="icon"></span>auto_pm
<a class="ext-link" href="http://192.168.10.4:8000/auto_pm/intertrac/wiki%3ARules/trac/%21RenderVerify" title="wiki:Rules/trac/!RenderVerify in Automated Project Manager"><span class="icon"></span>aut
<a class="ext-link" href="http://192.168.10.4:8000/bcs/intertrac/wiki%3Ab-node/bench/BoardIdentity" title="wiki:b-node/bench/BoardIdentity in Backyard Control System (b-node)"><span class="icon"></spa
<a class="ext-link" href="http://192.168.10.4:8000/auto_pm/intertrac/wiki%3APage" title="wiki:Page in Automated Project Manager"><span class="icon"></span>label</a>
<a class="ext-link" href="http://192.168.10.4:8000/auto_pm/intertrac/wiki%3AIndex" title="wiki:Index in Automated Project Manager"><span class="icon"></span>auto_pm:wiki:Index</a>
resp="$(curl -sf "http://127.0.0.1:${port}/healthz")"milestone_delete, ticket_batch_delete, ticket_delete, wiki_delete
server = yaml.load(
curl -s http://127.0.0.1:8080/healthz
claude mcp add --transport http trac http://127.0.0.1:8080/mcp \
| `--url URL` | MCP endpoint, e.g. `http://192.0.2.10:8091/mcp` |
The endpoint must be reached at exactly the configured path (e.g. `http://127.0.0.1:8080/mcp`, no trailing slash) -- it is not a path *prefix*, so there is no redirect to `/mcp/`.
server_args.append("--insecure")"--insecure",
data = base64.b64decode(_payload(result, "content_base64"))
return base64.b64decode(data_value or "")
data = base64.b64decode(encoded, validate=True)
cursor_bytes = base64.b64decode(cursor.encode("utf-8"))base64.b64decode(result.structuredContent["content_base64"])
'<span class="icon"></span>bcs:#99999</a> and also '
| `POST/GET/DELETE <path>` (default `/mcp`) | Yes, if `auth_token` is configured | The MCP JSON-RPC endpoint (streamable HTTP: `POST` for requests, `GET` for the SSE stream, `DELETE` to end a session)
Sessions are **stateful** (the SDK default): the server returns an `Mcp-Session-Id` response header on `initialize`, and clients send it back on subsequent requests. Each session gets its own MCP prot
Gates applied: no_behavioural_pass.
e3af4997ffc7full audit observations/trust-audit/mcp-server/nerpatech__trac-mcp-server.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | e3af4997ffc7 | BLOCK | D | 63 | first audit |
Questions
What is the trac-mcp-server MCP server?
A MCP (Model Context Protocol) server that provides AI assistants with tools to interact with Trac project management instances — managing tickets, wiki pages, and milestones
What tools does trac-mcp-server expose?
25 in total: 14 read-only, 7 that write, and 4 that can delete or overwrite (milestone_delete, ticket_batch_delete, ticket_delete, wiki_delete). Every one is listed on this page with its risk.
Is trac-mcp-server safe to connect to an agent?
No — not without reading the findings first. The audit graded it D (63/100) and found 8 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 4 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does trac-mcp-server need?
It reads TRAC_MCP_AUTH_TOKEN, TRAC_PASSWORD and TRAC_PASSWORD_2 from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does trac-mcp-server run?
It speaks sse, stdio and streamable-http, so it runs as a local process your client starts. It is published on PyPI as trac-mcp-server.
How current is this page?
The grade is for one exact copy of the source (e3af4997ffc7), read on 2026-10-11. The repository is watched and re-audited when it changes.