Official Go implementation of the UTCP
# Add to your Claude Code skills
git clone https://github.com/universal-tool-calling-protocol/go-utcpLast scanned: 5/30/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-05-30T16:38:25.552Z",
"npmAuditRan": true,
"pipAuditRan": true
}go-utcp is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by universal-tool-calling-protocol. Official Go implementation of the UTCP. It has 121 GitHub stars.
Yes. go-utcp passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/universal-tool-calling-protocol/go-utcp" and add it to your Claude Code skills directory (see the Installation section above).
go-utcp is primarily written in Go. It is open-source under universal-tool-calling-protocol on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh go-utcp against similar tools.
No comments yet. Be the first to share your thoughts!
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.

go-utcp is the Go implementation of the Universal Tool Calling Protocol (UTCP). It provides a single client-side abstraction for discovering, describing, searching, invoking, and streaming tools exposed through heterogeneous providers and transports.
The project is designed for applications that need to connect an agent, service, workflow engine, or automation runtime to many kinds of tools without coupling application logic to every transport individually.
UTCP is a protocol and architectural approach for exposing tools to software that needs to call them. A tool has metadata describing what it does, how it should be called, and which provider exposes it. A client can discover that metadata and invoke the tool without needing to implement provider-specific business logic at every call site.
The important idea is separation of concerns:
This makes UTCP useful as infrastructure for AI agents, automation platforms, developer tools, integration services, and ordinary backend applications.
A typical integration layer accumulates one SDK per remote system. An application may need separate code for HTTP APIs, CLIs, gRPC services, GraphQL APIs, WebSockets, MCP servers, and local utilities. go-utcp provides a common abstraction above those transports.
Instead of writing application logic such as:
if provider is HTTP -> use HTTP client
if provider is gRPC -> use gRPC client
if provider is MCP -> use MCP SDK
if provider is CLI -> start process
your application can work with:
result, err := client.CallTool(ctx, "provider.tool", args)
The transport-specific behavior stays below the tool-calling API.
A provider is a configured source of one or more tools. It contains enough metadata for go-utcp to discover and invoke those tools.
A tool is a callable capability. It has a name, description, input metadata, and provider association.
The repository stores discovered tool metadata. The default implementation is in memory, while interfaces allow applications to provide custom storage or search implementations.
A transport knows how to communicate with a provider. HTTP, gRPC, MCP, CLI, WebSocket, and other transports can implement the same higher-level tool invocation model.
Search selects tools from the local repository. Applications can use provider-scoped lookup or broader search strategies.
CodeMode lets a constrained Go-like program compose multiple tool calls in one execution. This is useful when an agent needs loops, branching, transformation, or multi-step orchestration.
.env loading.Check the module and examples for transport-specific requirements before deploying a particular provider.
Install the library with:
go get github.com/universal-tool-calling-protocol/go-utcp@latest
Then import it from Go:
import utcp "github.com/universal-tool-calling-protocol/go-utcp"
CodeMode is available under its plugin package:
import "github.com/universal-tool-calling-protocol/go-utcp/src/plugins/codemode"
The smallest useful example can use a local text provider, so no external server is required.
Create providers.json:
{
"providers": [
{
"provider_type": "text",
"name": "greetings",
"templates": {
"hello": "Hello, {{.name}}!"
}
}
]
}
Create a Go program:
package main
import (
"context"
"fmt"
"log"
utcp "github.com/universal-tool-calling-protocol/go-utcp"
)
func main() {
ctx := context.Background()
client, err := utcp.NewUTCPClient(ctx, &utcp.UtcpClientConfig{
ProvidersFilePath: "providers.json",
}, nil, nil)
if err != nil {
log.Fatal(err)
}
tools, err := client.SearchTools("", 10)
if err != nil {
log.Fatal(err)
}
for _, tool := range tools {
fmt.Printf("%s: %s\n", tool.Name, tool.Description)
}
result, err := client.CallTool(ctx, "greetings.hello", map[string]any{
"name": "UTCP",
})
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
}
Run it with:
go run .
The important detail is the qualified tool name:
<provider>.<tool>
For the example above:
greetings.hello
Provider qualification prevents ambiguous tool names when several providers expose tools with the same local name.
At a high level, go-utcp follows this flow:
Provider configuration
|
v
Provider loader
|
v
Provider registration
|
v
Tool discovery
|
v
Tool repository
|
+---------+---------+
| |
v v
Search Lookup
| |
+---------+---------+
|
v
Tool call
|
v
Transport layer
|
v
Provider
The application normally interacts with the client rather than directly with individual transport implementations.
During provider registration, the client asks a provider to expose its tool metadata. The metadata is stored in the configured repository.
An application or agent searches the repository to identify a tool. The search result gives the caller enough information to decide which tool to invoke.
The client resolves the qualified tool name, finds the associated provider and transport, validates the call path, and dispatches the invocation.
When a tool supports streaming, CallToolStream exposes a StreamResult. Consumers can incrementally read values until the stream reaches io.EOF or another error.
Providers are the central configuration unit in go-utcp. A provider normally contains:
Provider names should be stable, descriptive, and unique within a client configuration.
Good names include:
billing
catalog
github
internal-search
weather
payments
Avoid names that expose credentials or unstable