Atlas / MCP servers / abhishek-chohan / tool-control-plane

tool-control-planeBLOCK

mcp/abhishek-chohan/tool-control-plane

The unglamorous half of agent tooling: a gRPC control plane for sessions, machines, fenced writes, and capability-scoped keys. HTTP and MCP gateways; Python, TypeScript, and Go SDKs.

Verdict
BLOCK
Grade
F
Trust score
55 /100
Exposed tools
7 7r · 0w · 0d
Transport
stdio · streamable-http
License
Apache-2.0
Stars
0
01

Overview

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

[](https://github.com/Abhishek-chohan/tool-control-plane/actions/workflows/lint.yml) [](https://github.com/Abhishek-chohan/tool-control-plane/actions/workflows/proto-drift.yml) [](https://github.com/Abhishek-chohan/tool-control-plane/actions/workflows/conformance-python.yml) [](https://github.com/Abhishek-chohan/tool-control-plane/actions/workflows/release-gate.yml) [](LICENSE)

Toolplane is a gRPC control plane for tool execution that has to outlive the caller that started it. It owns the request lifecycle — durable requests, provider machine ownership with leases and heartbeats, bounded stream replay after disconnects, and drain-safe rollouts — so callers don't rebuild that machinery around every remote tool.

A model being able to call a tool is not a reason to use Toolplane. If the work is quick, in-process, and shares the caller's lifecycle, call it directly.

Status

Pre-1.0 and under active development — expect breaking changes. The wire contract is versioned: api.v1 is the compatibility boundary per the compatibility policy. The first tagged release is v0.1.0; notable changes land under CHANGELOG [Unreleased] between tags.

The release artifacts are published from the tag:

pip install toolplane-python-client==0.1.0      # SDK + toolplane-provider CLI
npm install [email protected]
docker pull ghcr.io/abhishek-chohan/toolplane-server:v0.1.0
go get git
Read from source at commit e0276251ce9dOBSERVED · 2026-10-12
Advertisement
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
claude mcp add toolplane-typescript-mcp-adapter --env TOOLPLANE_API_KEY=${TOOLPLANE_API_KEY} --env TOOLPLANE_AUTH_FIXED_API_KEY=${TOOLPLANE_AUTH_FIXED_API_KEY} --env TOOLPLANE_AUTH_MODE=${TOOLPLANE_AUTH_MODE} --env TOOLPLANE_CONFORMANCE_API_KEY=${TOOLPLANE_CONFORMANCE_API_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "toolplane-typescript-mcp-adapter": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "TOOLPLANE_API_KEY": "${TOOLPLANE_API_KEY}",
        "TOOLPLANE_AUTH_FIXED_API_KEY": "${TOOLPLANE_AUTH_FIXED_API_KEY}",
        "TOOLPLANE_AUTH_MODE": "${TOOLPLANE_AUTH_MODE}",
        "TOOLPLANE_CONFORMANCE_API_KEY": "${TOOLPLANE_CONFORMANCE_API_KEY}"
      }
    }
  }
}
03

Exposed tools (7)

7 read · 0 write · 0 destructive.

ToolRiskDescription
change_summaryreadBuild a concise summary for a rollout or change event
echo_toolreadEcho the caller message back from the maintained TypeScript provider runtime
incident_briefreadGenerate a brief operator-facing incident summary
session_statusreadReport session context for a connected operator or automation client
stream_toolreadStream tool
toolplane-mcp-concept-mapreadNative versus translated semantics for the optional MCP adapter
updatedreadrefreshed
04

Trust audit

BLOCKgrade F · trust 55/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
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 (6 observation(s))
Shell
declared (7 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
clients/typescript-client/src/proto/google/api/annotations_pb.js:21
return Function('return this')();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
clients/typescript-client/src/proto/google/api/http_pb.js:21
return Function('return this')();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
clients/typescript-client/src/proto/proto/service_pb.js:21
return Function('return this')();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
server/.env.example:8
TOOLPLANE_PROXY_ALLOWED_ORIGINS=http://localhost:3000,http://127.0.0.1:3000,http://localhost:8080
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/load.yml:55
TOOLPLANE_DATABASE_URL: postgres://postgres:postgres@localhost:5432/toolplane?sslmode=disable
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/release-gate.yml:81
TOOLPLANE_DATABASE_URL: "postgres://postgres:postgres@localhost:5432/toolplane?sslmode=disable"
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/release-gate.yml:100
TOOLPLANE_DATABASE_URL: "postgres://postgres:postgres@localhost:5432/toolplane?sslmode=disable"
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/release-gate.yml:122
TOOLPLANE_DATABASE_URL: "postgres://postgres:postgres@localhost:5432/toolplane?sslmode=disable"
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
server/docs/reference-deployment.md:206
cd server && TOOLPLANE_DATABASE_URL=postgres://toolplane:toolplane@localhost:5432/toolplane?sslmode=disable make release-gate
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
clients/go-client/client/toolplane_client_test.go:647
client.apiKey = "transport-auth-token"
LOWInventory / provenance · inv.hidden_file · CWE-1104
.golangci.yml
.golangci.yml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
clients/python-client/.flake8
.flake8
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
clients/python-client/.mypy-baseline
.mypy-baseline
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
clients/python-client/tests/conformance/.env.test.example
.env.test.example
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
clients/typescript-client/.eslintrc.cjs
.eslintrc.cjs
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/lint.yml:194
cp ../../LICENSE .
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/release.yml:107
cp ../../LICENSE .
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
clients/typescript-client/src/proto/google/api/annotations_pb.d.ts:8
import * as google_api_http_pb from "../../google/api/http_pb";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
clients/typescript-client/src/proto/google/api/annotations_pb.js:24
var google_api_http_pb = require('../../google/api/http_pb.js');
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
clients/typescript-client/tests/conformance/adapters/grpc_adapter.ts:44
} from '../../../src/proto/proto/service_pb';
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
clients/python-client/tests/conformance/conftest.py:282
health_url = f"http://127.0.0.1:{http_port}/health"
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
clients/python-client/tests/conformance/conftest.py:341
mcp_health_url = f"http://127.0.0.1:{mcp_port}/health"
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
clients/typescript-client/tests/conformance/environment.ts:228
if (!(await waitForHTTPHealth(`http://127.0.0.1:${httpPort}/health`, BOOTSTRAP_READINESS_TIMEOUT_MS))) {
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
clients/typescript-mcp-adapter/tests/gateway_initialize.test.ts:86
const gatewayURL = `http://127.0.0.1:${gatewayPort}/mcp`;
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
clients/python-client/requirements.txt
googleapis-common-protos, requests, typing-extensions, pydantic, pytest, pytest-cov, black, isort
Why it matters. 11 requirement(s) not pinned with ==
Fix. pin exact versions

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha e0276251ce9dfull audit observations/trust-audit/mcp-server/abhishek-chohan__tool-control-plane.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-12e0276251ce9dBLOCKF55first audit
06

Questions

What is the tool-control-plane MCP server?

The unglamorous half of agent tooling: a gRPC control plane for sessions, machines, fenced writes, and capability-scoped keys. HTTP and MCP gateways; Python, TypeScript, and Go SDKs.

What tools does tool-control-plane expose?

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

Is tool-control-plane safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (55/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does tool-control-plane need?

It reads TOOLPLANE_API_KEY, TOOLPLANE_AUTH_FIXED_API_KEY, TOOLPLANE_AUTH_MODE and TOOLPLANE_CONFORMANCE_API_KEY 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 tool-control-plane run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as toolplane-typescript-mcp-adapter at 1.0.0.

How current is this page?

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

Advertisement