StackA2A
orchestrationgo

Toolprotocol

35

by jonwraymond

Multi-protocol transport layer: MCP, A2A, ACP adapters

Updated 2026-02-06MIT
Quality Score35/100
Community
0
Freshness
86
Official
30
Skills
10
Protocol
30
🔒 Security
20

Getting Started

1Clone the repository
$ git clone https://github.com/jonwraymond/toolprotocol
2Navigate to the project
$ cd toolprotocol
3Install dependencies
$ go mod download
4Run the agent
$ go run .

README

toolprotocol

Protocol layer providing transport, wire format, and protocol primitives for MCP, A2A, and ACP integrations. This repo is pure Go: no network I/O is performed outside the transport implementations.

Part of the ApertureStack ecosystem.

Installation

go get github.com/jonwraymond/toolprotocol@latest

Packages

Package Purpose
content Unified content parts (text, image, audio, file, resource)
discover Service discovery + capability negotiation
transport Transport interfaces (stdio, SSE, streamable HTTP)
wire Protocol wire encoding (MCP, A2A, ACP)
stream Streaming events for progress/partial/complete
session Client session store + context helpers
task Long-running task lifecycle + subscriptions
resource MCP resources registry + subscriptions
prompt Prompt templates + registry
elicit User input elicitation (text/confirm/choice/form)

Quick Start

import (
  "context"

  "github.com/jonwraymond/toolprotocol/content"
  "github.com/jonwraymond/toolprotocol/transport"
  "github.com/jonwraymond/toolprotocol/wire"
)

type server struct{}

func (s *server) ServeTransport(ctx context.Context, t transport.Transport) error {
  return nil
}

ctx := context.Background()

// Build content parts
builder := content.NewBuilder()
parts := []content.Content{
  builder.Text("hello"),
}

// Encode a request using MCP wire format
codec := wire.NewMCP()
payload, err := codec.EncodeRequest(ctx, &wire.Request{
  ID:        "1",
  Method:    "tools/call",
  ToolID:    "echo",
  Arguments: map[string]any{"message": "hello"},
  Meta:      map[string]any{"content": parts},
})
_ = payload
_ = err

// Serve over a transport
tp, _ := transport.New("stdio", nil)
_ = tp.Serve(ctx, &server{})

Docs

See the docs directory and the aggregated docs site in ai-tools-stack.

License

MIT License - see LICENSE

Capabilities

StreamingPush NotificationsMulti-TurnAuth: none
agent-toolsai-toolsgolanggrpcllm-toolsmcpmcp-protocolwebsocket
View on GitHub