DoiT MCP ServerCAUTION
DoiT official MCP Server
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://opensource.org/licenses/MIT)
DoiT MCP Server provides access to the DoiT API. This server enables LLMs like Claude to access DoiT platform data for troubleshooting and analysis.
Authentication
How you authenticate depends on the connection method:
The legacy SSE endpoint (https://mcp.doit.com/sse) is deprecated and should not be used for new setups.
Your DoiT plan must include API access. Tools follow the same permissions as the DoiT API.
Tool results are capped at 140,000 serialized UTF-16 code units after response formatting, including structured content and metadata. Oversized reads return an actionable error; completed writes return a compact success receipt and must not be repeated just to retrieve their output. Errors remain errors. This is a response size policy, not a token limit or a bound on upstream downloads.
Each dispatched call emits a payload-free JSON mcp_tool_response event to stderr on stdio; some clients display these logs. Hosts can supply onResponseMetrics to route the events elsewhere. Use original.serializedChars for response-size percentiles and exceededLimit for over-limit rates; returned measures the result after the guard. Metrics also include UTF-8 byte counts, duration, tool/client
a7fd67826f68OBSERVED · 2026-10-12Connect
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 doit-mcp-server-integration-tests --env AUTH_SERVER_URL=${AUTH_SERVER_URL} --env DOIT_API_KEY=${DOIT_API_KEY} --env DOIT_OWN_CUSTOMER_API_KEY=${DOIT_OWN_CUSTOMER_API_KEY} -- npx -y @doitintl/[email protected]{
"mcpServers": {
"doit-mcp-server-integration-tests": {
"command": "npx",
"args": [
"-y",
"@doitintl/[email protected]"
],
"env": {
"AUTH_SERVER_URL": "${AUTH_SERVER_URL}",
"DOIT_API_KEY": "${DOIT_API_KEY}",
"DOIT_OWN_CUSTOMER_API_KEY": "${DOIT_OWN_CUSTOMER_API_KEY}"
}
}
}
}Exposed tools (44)
41 read · 2 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
Admin | read | Full access to all resources. |
Analytics | read | Cloud Analytics reports |
Editor | write | Can read and modify resources. |
Engineering | read | Engineering team costs |
FinOps | read | Access to billing, budgets, and cost reports. |
Test | read | Test prompt |
Trimmed | read | test |
Viewer | read | Read-only access. |
Widgets | read | Widget operations. |
__test_args__ | read | Test prompt with required args |
__test_multi__ | read | Multi-message test prompt |
__test_no_args__ | read | Prompt without arguments |
a | read | |
arg1 | read | First arg |
arg2 | read | Second arg |
b | read | |
bar | read | |
c | read | |
change_customer | read | Use this when a DoiT employee needs to switch the active customer context for subsequent API calls. Allows switching between different customer accounts. Do NOT use this for regular user operations — this is an internal DoiT employee tool only. |
cloud_overview | read | Get a high-level overview dashboard of your entire cloud infrastructure |
count | read | |
delete_widget | destructive | Deletes a widget. |
expert_inquiries | read | List recent DoiT expert inquiries, optionally filtered locally by specified criteria |
filter_fields_reference | read | Filter fields explanation for GCP and AWS resources |
flowID | read | Flow ID |
foo | read | |
generate_report_command | read | Template for generating cost reports |
get_widget | read | Get a widget |
id | read | User ID |
keyword | read | Keyword to search for in ticket subject and body |
limit | read | Optional, number of items |
my_new_prompt | read | ... |
name | read | User name |
opt | read | |
p | read | d |
payload | read | |
platform | read | Optional, related platform |
product | read | Optional, related product |
read_test_resource | read | Test read |
req | read | |
requestBodyJson | read | |
search_expert_inquiries | read | Search DoiT expert inquiries by keyword, optionally filtered by platform and product |
status | read | Optional, status (${VALID_TICKET_STATUSES}) |
trigger_cloudflow_flow | write | Trigger a flow defined in CloudFlow by its flow ID, optionally passing a JSON payload as the request body if the flow requires it |
Trust audit
CAUTIONgrade C · trust 78/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (2 observation(s))
- Network
- declared (3 observation(s))
- Shell
- none-observed
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (21)
{ token: "00000000-0000-0000-0000-000000000000" },arguments: { token: "00000000-0000-0000-0000-000000000000" },const SECRET = "SECRET-ARGUMENT-VALUE";
delete_widget
.pre-commit-config.yaml
echo "**Full diff:** [\`${range_label}\`](../../compare/${range_label})"const packageJson = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8"));const doc = readFileSync(new URL("../../../docs/cloudflow-authoring.md", import.meta.url), "utf8");import { makeDoitRequest } from "../../utils/util.js";vi.mock("../../utils/util.js", async (importOriginal) => {["loopback http URL", "http://127.0.0.1/"],
DOIT_API_BASE: `http://127.0.0.1:${address.port}`,const binary = atob(base64);
const header = JSON.parse(atob(b64url(parts[0])));
const payload = JSON.parse(atob(b64url(parts[1])));
@modelcontextprotocol/server, dotenv, zod, @readme/openapi-parser, @types/node, openapi-types, shx, typescript
@modelcontextprotocol/sdk, @types/node, msw, typescript, vitest
| Remote (Streamable HTTP) | `https://mcp.doit.com/mcp` | OAuth — your client opens a DoiT sign-in and consent page. Headless clients can instead send a customer personal API token as `Authorization:
Any other client that can send a static `Authorization` header to a Streamable HTTP MCP server works the same way. Guidance: create a dedicated API token for the agent, keep it in a secret store, rota
src/tools/generated/openapi.json
Full access to all resources.
Gates applied: no_behavioural_pass.
a7fd67826f68full audit observations/trust-audit/mcp-server/doitintl__doit-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-12 | a7fd67826f68 | CAUTION | C | 78 | first audit |
Questions
What is the @doitintl/doit-mcp-server MCP server?
DoiT official MCP Server
What tools does @doitintl/doit-mcp-server expose?
44 in total: 41 read-only, 2 that write, and 1 that can delete or overwrite (delete_widget). Every one is listed on this page with its risk.
Is @doitintl/doit-mcp-server safe to connect to an agent?
With care. The audit graded it C (78/100) and found 21 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 1 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does @doitintl/doit-mcp-server need?
It reads AUTH_SERVER_URL, DOIT_API_KEY and DOIT_OWN_CUSTOMER_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 @doitintl/doit-mcp-server run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as @doitintl/doit-mcp-server-integration-tests at 2.4.0.
How current is this page?
The grade is for one exact copy of the source (a7fd67826f68), read on 2026-10-12. The repository is watched and re-audited when it changes.