Atlas / MCP servers / universal-tool-calling-protocol / Universal Tool Calling Protocol (UTCP) for TypeScript

Universal Tool Calling Protocol (UTCP) for TypeScriptBLOCK

mcp/universal-tool-calling-protocol/typescript-utcp

Official typescript implementation of UTCP. UTCP is an open standard that lets AI agents call any API directly, without extra middleware.

Verdict
BLOCK
Grade
F
Trust score
60 /100
Exposed tools
16 13r · 3w · 0d
Transport
stdio · streamable-http
License
MPL-2.0
Stars
119
01

Overview

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

[](https://github.com/universal-tool-calling-protocol) [](https://www.npmjs.com/package/@utcp/sdk) [](https://github.com/universal-tool-calling-protocol/typescript-utcp/blob/main/LICENSE) [](https://cdtm.com/)

The Universal Tool Calling Protocol (UTCP) is a secure and scalable standard for defining and interacting with tools across a wide variety of communication protocols. This repository contains the official TypeScript implementation, structured as a monorepo with a lean core and pluggable communication protocols.

UTCP offers a unified framework for integrating disparate tools and services, making them accessible through a consistent and well-defined interface. This TypeScript SDK provides a comprehensive toolkit for developers to leverage the full power of the UTCP standard in their applications.

Key Features

  • Automatic Plugin Registration: The official plugins are automatically discovered and registered when you import the core client—no manual setup required. For other plugins, you will need to register them manually.
  • Scalability: Designed to handle a large number of tools and providers without compromising performance.
  • Extensibility: A pluggable architecture allows developers to easily add new communication protocols, tool storage mechanisms, and search strategies without modifying the core library.
  • Interoperability: With a growing ecosystem of protocol plugins—including HTTP, MCP, Text, File, and CLI—UTCP can integrate with almost any existing service or infrastructure.
  • Code Execution Mode: Execute TypeScript code with hierarchical ac
Read from source at commit fe34c6b32776OBSERVED · 2026-10-12
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 text --env UTCP_TEST_FAKE_SECRET=${UTCP_TEST_FAKE_SECRET} -- npx -y @utcp/[email protected]
claude-desktop
{
  "mcpServers": {
    "text": {
      "command": "npx",
      "args": [
        "-y",
        "@utcp/[email protected]"
      ],
      "env": {
        "UTCP_TEST_FAKE_SECRET": "${UTCP_TEST_FAKE_SECRET}"
      }
    }
  }
}
03

Exposed tools (16)

13 read · 3 write · 0 destructive.

ToolRiskDescription
addwriteAdds two numbers
add_numbers_cliwriteAdds two numbers via CLI.
cli_toolreadCLI test tool
echoread
echo_clireadEchoes a message via CLI.
get_userreadGets a user by ID.
greetreadGreets a person
http_toolreadHTTP test tool
pingreadA tool
read_envreadReads a specific environment variable.
sse_toolreadAn SSE test tool
stream_toolreadA streaming test tool
tread
test.toolreadA test tool.
test_toolreadA simple test tool
write_file_cliwriteWrites content to a file in the CWD.
04

Trust audit

BLOCKgrade F · trust 60/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 (5 observation(s))
Network
declared (5 observation(s))
Shell
declared (4 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
packages/file/src/file_communication_protocol.ts:57
data = yaml.load(content);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
packages/http/src/http_communication_protocol.ts:91
responseData = yaml.load(response.data);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
packages/http/src/http_communication_protocol.ts:224
return yaml.load(response.data);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
packages/text/src/text_communication_protocol.ts:43
data = yaml.load(content);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/src/data/auth_implementations/api_key_auth.ts:2
import { Serializer } from "../../interfaces/serializer";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/src/data/auth_implementations/basic_auth.ts:3
import { Serializer } from '../../interfaces/serializer';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/src/data/auth_implementations/oauth2_auth.ts:3
import { Serializer } from '../../interfaces/serializer';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/src/data/auth_implementations/oauth2_user_auth.ts:3
import { Serializer } from '../../interfaces/serializer';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/src/implementations/post_processors/filter_dict_post_processor.ts:3
import { ToolPostProcessor } from '../../interfaces/tool_post_processor';
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
packages/http/tests/redirect_security.test.ts:364
describe('HttpCommunicationProtocol redirect exfiltration', () => {
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/http/tests/redirect_security.test.ts:45
{ url: 'http://169.254.169.254/latest/meta-data/', method: 'GET' },
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/http/tests/redirect_security.test.ts:53
res.writeHead(302, { Location: 'http://169.254.169.254/latest/meta-data/' });
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/http/tests/redirect_security.test.ts:367
res.writeHead(302, { Location: 'http://169.254.169.254/latest/meta-data/' });
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/http/tests/redirect_security.test.ts:397
token_url: 'http://169.254.169.254/oauth/token',
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/http/tests/redirect_security.test.ts:455
makeMaliciousSpec('http://169.254.169.254/token'),
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/http/README.md:564
'http://127.0.0.1:3000'
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/http/tests/loopback_manual_security.test.ts:25
manualWith("http://127.0.0.1:9200/secret"),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/http/tests/loopback_manual_security.test.ts:34
manualWith("http://127.0.0.2:9200/secret"),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/http/tests/loopback_manual_security.test.ts:42
"http://127.0.0.1:8765/manual",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/http/tests/loopback_manual_security.test.ts:43
manualWith("http://127.0.0.1:9200/secret"),
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@types/js-yaml, bun-types, nock, tsup, zod
Why it matters. 5 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
packages/cli/package.json
@utcp/sdk, bun-types, typescript, @types/bun
Why it matters. 4 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
packages/core/package.json
dotenv, zod, bun-types, typescript
Why it matters. 4 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
packages/direct-call/package.json
@utcp/sdk, bun-types, typescript, @types/bun
Why it matters. 4 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
packages/dotenv-loader/package.json
dotenv, zod, bun-types, typescript
Why it matters. 4 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha fe34c6b32776full audit observations/trust-audit/mcp-server/universal-tool-calling-protocol__typescript-utcp.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-12fe34c6b32776BLOCKF60first audit
06

Questions

What is the @utcp/sdk MCP server?

Official typescript implementation of UTCP. UTCP is an open standard that lets AI agents call any API directly, without extra middleware.

What tools does @utcp/sdk expose?

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

Is @utcp/sdk safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (60/100) and found 4 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 @utcp/sdk need?

It reads UTCP_TEST_FAKE_SECRET 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 @utcp/sdk run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @utcp/text at 1.1.0.

How current is this page?

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

Advertisement