Atlas / MCP servers / daghis / TeamCity

TeamCityCAUTION

mcp/daghis/teamcity-1

Model Context Protocol (MCP) server for JetBrains TeamCity: control builds, tests, agents and configs from AI coding assistants.

Verdict
CAUTION
Grade
B
Trust score
83 /100
Exposed tools
12 12r · 0w · 0d
Transport
stdio
License
MIT
Stars
30
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://github.com/Daghis/teamcity-mcp/actions/workflows/ci.yml) [](https://github.com/Daghis/teamcity-mcp/actions/workflows/codeql.yml) [](https://codecov.io/gh/Daghis/teamcity-mcp) [](LICENSE)

A Model Control Protocol (MCP) server that bridges AI coding assistants with JetBrains TeamCity CI/CD server, exposing TeamCity operations as MCP tools.

[!NOTE] Project status (June 2026): stable, low-key maintenance. This does what it set out to do and is no longer under active development. It still works and stays installable; issues and PRs may get slow or no response, and security fixes are best-effort. JetBrains now ships official AI integration for TeamCity — a built-in MCP and the TeamCity CLI with an installable agent skill — which is the better default for most workflows. See How this compares to JetBrains' official tooling below before adopting.

Overview

The TeamCity MCP Server allows developers using AI-powered coding assistants (Claude Code, Cursor, Windsurf) to interact with TeamCity directly from their development environment via MCP tools.

Upgrading from 1.x? Version 2.0.0 moved 15 tools from Dev to Full mode, including queue management, agent compatibility checks, and server health monitoring. If you relied on these tools in Dev mode, switch to MCP_MODE=full or use runtime mode switching (v2.1.0+). See [C
Read from source at commit ec66c2be5fb7OBSERVED · 2026-10-08
02

Connect

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-code (npm)
claude mcp add teamcity-mcp --env TEAMCITY_TOKEN=${TEAMCITY_TOKEN} -- npx -y @daghis/[email protected]
03

Exposed tools (12)

12 read · 0 write · 0 destructive.

ToolRiskDescription
UpdatedreadNew description
barereadno outputSchema
failing-toolreadA tool that fails
list_projectsreadlist projects
newreaddesc
pingreadTest connectivity
strict_listreaddeclares strict list outputSchema
tool1readFirst tool
tool2readSecond tool
tool3readThird tool
validated-toolreadA tool with validation
with_schemareaddeclares an outputSchema
04

Trust audit

CAUTIONgrade B · trust 83/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (2 observation(s))
Network
declared (5 observation(s))
Shell
declared (2 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (19)

MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/unit/tools/ssh-keys.test.ts:61
'-----BEGIN RSA PRIVATE KEY-----\nfake\n-----END RSA PRIVATE KEY-----',
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/unit/tools/ssh-keys.test.ts:95
async () => '-----BEGIN RSA PRIVATE KEY-----\nfake\n-----END RSA PRIVATE KEY-----'
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.release-please-config.json
.release-please-config.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.release-please-manifest.json
.release-please-manifest.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
src/teamcity-client/.openapi-generator-ignore
.openapi-generator-ignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/integration/build-config-extensions-scenario.test.ts:162
'teamcity.ssh.agent.key': 'id_rsa',
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/unit/tools/manage-build-config-extensions.test.ts:338
property: [{ name: 'teamcity.ssh.agent.key', value: 'id_rsa' }],
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/unit/tools/manage-build-config-extensions.test.ts:364
'teamcity.ssh.agent.key': 'id_rsa',
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/unit/tools/manage-build-config-extensions.test.ts:382
{ name: 'teamcity.ssh.agent.key', value: 'id_rsa' },
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/unit/tools/manage-build-config-extensions.test.ts:426
{ name: 'teamcity.ssh.agent.key', value: 'id_rsa' },
Why it matters. touches a credential store
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/utils/cli-args.ts:126
join(__dirname, '../../package.json'), // source: src/utils/ -> package.json
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/integration/lib/test-fixtures.ts:7
import type { ActionResult, BuildRef, TriggerBuildResult } from '../../types/tool-results';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/integration/mcp-stdio-compliance.test.ts:17
import packageJson from '../../package.json';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/integration/mcp-stdio-compliance.test.ts:146
const tsxPath = join(__dirname, '../../node_modules/tsx/dist/cli.mjs');
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/integration/mcp-stdio-compliance.test.ts:147
const serverPath = join(__dirname, '../../src/index.ts');
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/unit/teamcity/api-client.test.ts:282
baseUrl = `http://127.0.0.1:${address.port}`;
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, axios, axios-retry, tslib, winston, zod, @esbuild-plugins/tsconfig-paths, @eslint/js
Why it matters. 30 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
src/teamcity-client/package.json
axios, typescript
Why it matters. 2 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha ec66c2be5fb7full audit observations/trust-audit/mcp-server/daghis__teamcity-1.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-08ec66c2be5fb7CAUTIONB83first audit
06

Questions

What is the TeamCity MCP server?

Model Context Protocol (MCP) server for JetBrains TeamCity: control builds, tests, agents and configs from AI coding assistants.

What tools does TeamCity expose?

12 in total: 12 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is TeamCity safe to connect to an agent?

With care. The audit graded it B (83/100) and found 19 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does TeamCity need?

It reads CODECOV_TOKEN, TEAMCITY_API_TOKEN and TEAMCITY_TOKEN 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 TeamCity run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as @teamcity/client at 1.0.0.

How current is this page?

The grade is for one exact copy of the source (ec66c2be5fb7), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement