Skip to content

Commit 3769d63

Browse files
committed
v1.0.4: Feature parity with yoagent - MCP, OpenAPI, enhanced tools
1 parent 899ad81 commit 3769d63

4 files changed

Lines changed: 133 additions & 10 deletions

File tree

agent.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,11 @@ func (a *Agent) GetTools() []Tool {
260260
return tools
261261
}
262262

263+
func (a *Agent) AddTool(tool Tool) *Agent {
264+
a.tools[tool.Name] = tool
265+
return a
266+
}
267+
263268
func (a *Agent) Prompt(ctx context.Context, text string) chan Event {
264269
events := make(chan Event, 64)
265270
go func() {

mcp/helpers.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package mcp
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
)
8+
9+
type McpClient struct {
10+
Transport Transport
11+
}
12+
13+
func NewMcpClient(t Transport) *McpClient {
14+
return &McpClient{Transport: t}
15+
}
16+
17+
func ConnectStdio(command string, args []string, env map[string]string) (*McpClient, error) {
18+
transport, err := NewStdioTransport(command, args, env)
19+
if err != nil {
20+
return nil, err
21+
}
22+
return &McpClient{Transport: transport}, nil
23+
}
24+
25+
func ConnectHTTP(url string, headers map[string]string) *McpClient {
26+
transport := NewHTTPTransport(url, headers)
27+
return &McpClient{Transport: transport}
28+
}
29+
30+
func (c *McpClient) ListTools(ctx context.Context) ([]Tool, error) {
31+
req := JsonRpcRequest{
32+
JSONRPC: "2.0",
33+
Method: "tools/list",
34+
Params: nil,
35+
ID: 1,
36+
}
37+
38+
resp, err := c.Transport.Send(req)
39+
if err != nil {
40+
return nil, err
41+
}
42+
43+
var result struct {
44+
Tools []Tool `json:"tools"`
45+
}
46+
if resp.Result != nil {
47+
if err := json.Unmarshal(resp.Result, &result); err != nil {
48+
return nil, err
49+
}
50+
}
51+
return result.Tools, nil
52+
}
53+
54+
func (c *McpClient) CallTool(ctx context.Context, name string, args map[string]string) (string, error) {
55+
paramsRaw, _ := json.Marshal(map[string]interface{}{
56+
"name": name,
57+
"arguments": args,
58+
})
59+
60+
req := JsonRpcRequest{
61+
JSONRPC: "2.0",
62+
Method: "tools/call",
63+
Params: paramsRaw,
64+
ID: 2,
65+
}
66+
67+
resp, err := c.Transport.Send(req)
68+
if err != nil {
69+
return "", err
70+
}
71+
72+
if resp.Error != nil {
73+
return "", fmt.Errorf("MCP error: %s", resp.Error.Message)
74+
}
75+
76+
var result struct {
77+
Content []struct {
78+
Text string `json:"text"`
79+
} `json:"content"`
80+
}
81+
if resp.Result != nil {
82+
if err := json.Unmarshal(resp.Result, &result); err != nil {
83+
return "", err
84+
}
85+
}
86+
87+
text := ""
88+
for _, c := range result.Content {
89+
text += c.Text
90+
}
91+
return text, nil
92+
}
93+
94+
func RunMCPCommand(ctx context.Context, cmd string, args []string) ([]Tool, error) {
95+
parts := append([]string{cmd}, args...)
96+
command := parts[0]
97+
commandArgs := parts[1:]
98+
99+
transport, err := NewStdioTransport(command, commandArgs, nil)
100+
if err != nil {
101+
return nil, err
102+
}
103+
104+
client := &McpClient{Transport: transport}
105+
return client.ListTools(ctx)
106+
}

mcp/tool_adapter.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ import (
44
"context"
55
"encoding/json"
66
"fmt"
7-
8-
iteragent "github.com/GrayCodeAI/iteragent"
97
)
108

9+
type ExecutableTool struct {
10+
Name string
11+
Description string
12+
Execute func(ctx context.Context, args map[string]string) (string, error)
13+
}
14+
1115
type ToolAdapter struct {
1216
client *Client
1317
}
@@ -16,16 +20,16 @@ func NewToolAdapter(client *Client) *ToolAdapter {
1620
return &ToolAdapter{client: client}
1721
}
1822

19-
func (a *ToolAdapter) GetTools(ctx context.Context) ([]iteragent.Tool, error) {
23+
func (a *ToolAdapter) GetTools(ctx context.Context) ([]ExecutableTool, error) {
2024
mcpTools, err := a.client.ListTools(ctx)
2125
if err != nil {
2226
return nil, err
2327
}
2428

25-
tools := make([]iteragent.Tool, len(mcpTools))
29+
tools := make([]ExecutableTool, len(mcpTools))
2630
for i, t := range mcpTools {
2731
mt := t
28-
tools[i] = iteragent.Tool{
32+
tools[i] = ExecutableTool{
2933
Name: mt.Name,
3034
Description: mt.Description,
3135
Execute: func(ctx context.Context, args map[string]string) (string, error) {

openapi/adapter.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import (
77
"io"
88
"net/http"
99
"strings"
10-
11-
iteragent "github.com/GrayCodeAI/iteragent"
1210
)
1311

1412
type Spec struct {
@@ -87,6 +85,10 @@ func LoadSpec(data []byte) (*Spec, error) {
8785
return &spec, nil
8886
}
8987

88+
func ParseSpec(data []byte) (*Spec, error) {
89+
return LoadSpec(data)
90+
}
91+
9092
func NewAdapter(spec *Spec, config Config) *Adapter {
9193
baseURL := config.BaseURL
9294
if baseURL == "" && len(spec.Servers) > 0 {
@@ -100,8 +102,14 @@ func NewAdapter(spec *Spec, config Config) *Adapter {
100102
}
101103
}
102104

103-
func (a *Adapter) GetTools() ([]iteragent.Tool, error) {
104-
var tools []iteragent.Tool
105+
type Tool struct {
106+
Name string
107+
Description string
108+
Execute func(ctx context.Context, args map[string]string) (string, error)
109+
}
110+
111+
func (a *Adapter) GetTools() ([]Tool, error) {
112+
var tools []Tool
105113

106114
for path, item := range a.spec.Paths {
107115
for method, op := range map[string]*Operation{"get": item.Get, "post": item.Post, "put": item.Put, "delete": item.Delete} {
@@ -113,7 +121,7 @@ func (a *Adapter) GetTools() ([]iteragent.Tool, error) {
113121
pathStr := path
114122
methodStr := method
115123

116-
tool := iteragent.Tool{
124+
tool := Tool{
117125
Name: fmt.Sprintf("%s_%s", methodStr, cleanPath(pathStr)),
118126
Description: operation.Description,
119127
Execute: func(ctx context.Context, args map[string]string) (string, error) {

0 commit comments

Comments
 (0)