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!

go-utcp is a Go client for the Universal Tool Calling Protocol (UTCP). It discovers tools from configured providers, keeps their metadata in a local repository, and exposes one API for searching, calling, and streaming tool results across different transports.
$VAR and ${VAR} substitution from explicit values, .env files, or the process environment.go get github.com/universal-tool-calling-protocol/go-utcp@latest
Create providers.json with a local text-template provider. This transport needs no external service:
{
"providers": [
{
"provider_type": "text",
"name": "greetings",
"templates": {
"hello": "Hello, {{.name}}!"
}
}
]
}
Load the provider, inspect its tools, and call greetings.hello:
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)
}
go run .
Tools are qualified as <provider>.<tool>, which prevents collisions when several providers expose the same tool name.
ProvidersFilePath accepts any of these JSON root shapes:
providers array or object.Every provider needs a provider_type. The built-in values are:
| Provider type | Transport |
|---|---|
http |
HTTP/HTTPS, including OpenAPI discovery |
cli |
Local command-line process |
sse |
Server-Sent Events |
http_stream |
Streamable HTTP |
websocket |
WebSocket |
grpc |
gRPC and gNMI |
graphql |
GraphQL queries and subscriptions |
tcp |
Raw TCP |
udp |
UDP |
webrtc |
WebRTC data channel |
mcp |
MCP over stdio or HTTP |
text |
Local Go text templates |
Provider-specific fields and complete client/server pairs are available in examples/.
Provider strings can reference $NAME or ${NAME}. Values are resolved in this order:
UtcpClientConfig.VariablesUtcpClientConfig.LoadVariablesFromFor example:
cfg := &utcp.UtcpClientConfig{
ProvidersFilePath: "providers.json",
Variables: map[string]string{
"API_HOST": "api.example.com",
},
LoadVariablesFrom: []utcp.UtcpVariablesConfig{
utcp.NewDotEnv(".env"),
},
}
{
"provider_type": "http",
"name": "catalog",
"http_method": "POST",
"url": "https://${API_HOST}/tools",
"headers": {
"Authorization": "Bearer ${API_TOKEN}"
}
}
Keep secrets outside committed provider files.
| Method | Purpose |
|---|---|
RegisterToolProvider |
Discover and store the tools exposed by a provider. |
DeregisterToolProvider |
Remove a provider and its tools. |
SearchTools |
List all tools or filter them by provider prefix. |
CallTool |
Invoke a tool and return its result. |
CallToolStream |
Invoke a streaming tool and return a StreamResult. |
GetTransports |
Access the client's registered transport implementations. |
Pass an empty prefix to SearchTools to list every registered tool, or pass a provider name to restrict the result to that provider.
Streaming calls return a StreamResult. Read until io.EOF and always close the stream:
stream, err := client.CallToolStream(ctx, "events.watch", args)
if err != nil {
log.Fatal(err)
}
defer stream.Close()
for {
item, err := stream.Next()
if errors.Is(err, io.EOF) {
break
}
if err != nil {
log.Fatal(err)
}
fmt.Println(item)
}
Streaming support depends on the selected transport and tool.
CodeMode executes a constrained Go-like snippet with helpers for calling registered UTCP tools. It is useful for loops, branching, multi-tool composition, and processing intermediate results without serializing every step as a separate tool request.
import "github.com/universal-tool-calling-protocol/go-utcp/src/plugins/codemode"
cm := codemode.NewCodeModeUTCP(client, nil)
result, err := cm.Execute(ctx, codemode.CodeModeArgs{
Code: `
value, err := codemode.CallTool("greetings.hello", map[string]any{
"name": "CodeMode",
})
if err != nil {
__out = err
return
}
__out = value
`,
Timeout: 5_000,
})
Snippets can use codemode.CallTool, codemode.CallToolStream, and codemode.SearchTools. CodeModeResult contains the resulting value plus captured standard output and standard error.
The examples directory contains standalone modules for each client and transport. Run an example from its directory with workspace mode disabled so that Go uses the example's own module:
cd examples/text_client
GOWORK=off go run -mod=mod .
Some network examples start an in-process demo server; others require the matching transport example or another local dependency. See the source in each directory for its setup.
git clone https://github.com/universal-tool-calling-protocol/go-utcp.git
cd go-utcp
go test ./...
New contributors can also follow onboarding.md.
This project is licensed under the Mozilla Public License 2.0.