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 119 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!

The Universal Tool Calling Protocol (UTCP) is a modern, flexible, and scalable standard for defining and interacting with tools across a wide variety of communication protocols. It is designed to be easy to use, interoperable, and extensible, making it a powerful choice for building and consuming tool-based services.
In contrast to other protocols like MCP, UTCP places a strong emphasis on:
.env files using
UtcpDotEnv.OpenApiConverter to convert OpenAPI definitions
into UTCP manuals.examples directory.Each subdirectory under examples/ is a standalone Go module demonstrating a client or transport. For an overview of available examples and usage instructions, see examples/README.md. When
building or running an example from this repository, disable the
workspace to ensure Go uses the module's own go.mod:
GOWORK=off go run ./examples/cli_transport
Add the library to your project with:
go get github.com/universal-tool-calling-protocol/go-utcp@latest
You can then construct a client and call tools using any of the built-in transports. The library ships transports for HTTP, Server-Sent Events, streaming HTTP, CLI, WebSocket, gRPC, GraphQL, TCP, UDP, WebRTC and MCP providers.
package main
import (
"context"
"fmt"
"os"
"time"
utcp "github.com/universal-tool-calling-protocol/go-utcp"
)
func main() {
ctx := context.Background()
cfg := &utcp.UtcpClientConfig{
ProvidersFilePath: "providers.json",
}
fmt.Println("Creating UTCP client...")
client, err := utcp.NewUTCPClient(ctx, cfg, nil, nil)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to create UTCP client: %v\n", err)
os.Exit(1)
}
// Give the client time to fully initialize
fmt.Println("Waiting for initialization...")
time.Sleep(500 * time.Millisecond)
fmt.Println("\n=== Tool Discovery ===")
tools, err := client.SearchTools("", 10)
if err != nil {
fmt.Fprintf(os.Stderr, "search error: %v\n", err)
os.Exit(1)
}
if len(tools) == 0 {
fmt.Println("No tools found!")
os.Exit(1)
}
tool := tools[0]
fmt.Printf("Found tool: %s\n", tool.Name)
fmt.Printf("Tool description: %s\n", tool.Description)
// Test the tool call
fmt.Println("\n=== Tool Call Test ===")
input := map[string]interface{}{
"name": "Kamil",
}
fmt.Printf("Calling tool '%s' with input: %v\n", tool.Name, input)
result, err := client.CallTool(ctx, tool.Name, input)
if err != nil {
fmt.Printf("ERROR: %v\n", err)
// Try to understand the error better
fmt.Printf("Error type: %T\n", err)
fmt.Printf("Error string: %s\n", err.Error())
// Let's try a direct search for the provider
fmt.Println("\n=== Searching for provider directly ===")
providerTools, err2 := client.SearchTools("hello", 10)
if err2 != nil {
fmt.Printf("Provider search failed: %v\n", err2)
} else {
fmt.Printf("Provider search returned %d tools\n", len(providerTools))
for i, t := range providerTools {
fmt.Printf(" %d: %s\n", i, t.Name)
}
}
} else {
fmt.Printf("SUCCESS: %v\n", result)
}
}
CodeMode is an executable tool plugin that lets LLMs write and run small Go-like code snippets instead of emitting large JSON tool calls. It executes snippets inside a Yaegi sandbox, providing direct access to UTCP tools via inline helper functions:
r, err := codemode.CallTool("http.echo", map[string]any{"message": "hi"})
Available helpers inside CodeMode:
CallTool(name string, args map[string]any) (any, error)CallToolStream(name string, args map[string]any) (*StreamResult, error)SearchTools(query string, limit int) ([]tools.Tool, error)CodeMode wraps user snippets into a structured run() function, normalizes Go syntax, converts JSON expressions automatically, and exposes the result through __out.
Key benefits:
Enable it by registering the plugin:
cm := codemode.NewCodeModeUTCP(client, llmodel)
// LLm model must satisfy interface from NewCodeModeUTCP