Skip to content

Commit 230fc16

Browse files
grokifyclaude
andcommitted
docs: add usage examples
- examples/basic: credential storage, listing, and retrieval - examples/mcp: MCP server integration pattern with ToolContext Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 7e0a0d2 commit 230fc16

2 files changed

Lines changed: 208 additions & 0 deletions

File tree

examples/basic/main.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Package main demonstrates basic usage of omnitoken.
2+
package main
3+
4+
import (
5+
"context"
6+
"fmt"
7+
"log"
8+
"log/slog"
9+
"os"
10+
11+
"github.com/grokify/goauth"
12+
"github.com/plexusone/omnitoken"
13+
"github.com/plexusone/omnivault/providers/memory"
14+
)
15+
16+
func main() {
17+
ctx := context.Background()
18+
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug}))
19+
20+
// Create an in-memory vault for demonstration.
21+
// In production, use a real vault backend like 1Password, HashiCorp Vault, etc.
22+
vault := memory.New()
23+
24+
// Create the token manager
25+
mgr, err := omnitoken.New(omnitoken.Config{
26+
Vault: vault,
27+
Logger: logger,
28+
})
29+
if err != nil {
30+
log.Fatalf("failed to create token manager: %v", err)
31+
}
32+
defer func() {
33+
if err := mgr.Close(); err != nil {
34+
logger.Error("failed to close token manager", "error", err)
35+
}
36+
}()
37+
38+
// Store OAuth2 credentials for a service
39+
creds := &goauth.Credentials{
40+
Service: "github",
41+
Type: goauth.TypeOAuth2,
42+
OAuth2: &goauth.CredentialsOAuth2{
43+
ClientID: "your-client-id",
44+
ClientSecret: "your-client-secret",
45+
GrantType: "client_credentials",
46+
Scopes: []string{"repo", "user"},
47+
},
48+
}
49+
50+
if err := mgr.SetCredentials(ctx, "my-github-app", creds); err != nil {
51+
log.Fatalf("failed to store credentials: %v", err)
52+
}
53+
54+
// List all stored credentials
55+
names, err := mgr.ListCredentials(ctx)
56+
if err != nil {
57+
log.Fatalf("failed to list credentials: %v", err)
58+
}
59+
fmt.Printf("Stored credentials: %v\n", names)
60+
61+
// Retrieve credentials
62+
retrieved, err := mgr.GetCredentials(ctx, "my-github-app")
63+
if err != nil {
64+
log.Fatalf("failed to get credentials: %v", err)
65+
}
66+
fmt.Printf("Retrieved: service=%s, type=%s\n", retrieved.Service, retrieved.Type)
67+
68+
// In a real scenario, you would get an authenticated client:
69+
// client, err := mgr.GetClient(ctx, "my-github-app")
70+
// if err != nil {
71+
// log.Fatalf("failed to get client: %v", err)
72+
// }
73+
// resp, err := client.Get("https://api.github.com/user")
74+
75+
fmt.Println("Done!")
76+
}

examples/mcp/main.go

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// Package main demonstrates using omnitoken with MCP servers.
2+
//
3+
// This example shows how omnitoken can provide credentials to MCP server tools.
4+
package main
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"log"
10+
"log/slog"
11+
"net/http"
12+
"os"
13+
14+
"github.com/grokify/goauth"
15+
"github.com/plexusone/omnitoken"
16+
"github.com/plexusone/omnivault/providers/memory"
17+
)
18+
19+
// ToolContext provides credentials to MCP tools.
20+
// This would be injected into tool handlers in omniskill.
21+
type ToolContext struct {
22+
tokenMgr *omnitoken.TokenManager
23+
logger *slog.Logger
24+
}
25+
26+
// GetClient returns an authenticated HTTP client for the named service.
27+
// MCP tools can use this to make authenticated API calls.
28+
func (tc *ToolContext) GetClient(ctx context.Context, serviceName string) (*http.Client, error) {
29+
return tc.tokenMgr.GetClient(ctx, serviceName)
30+
}
31+
32+
// GetCredentials returns credentials for inspection or custom auth flows.
33+
func (tc *ToolContext) GetCredentials(ctx context.Context, serviceName string) (*goauth.Credentials, error) {
34+
return tc.tokenMgr.GetCredentials(ctx, serviceName)
35+
}
36+
37+
func main() {
38+
ctx := context.Background()
39+
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug}))
40+
41+
// In production, use a real vault backend.
42+
// Example: 1Password via op:// URIs, HashiCorp Vault, etc.
43+
vault := memory.New()
44+
45+
// Create the token manager
46+
mgr, err := omnitoken.New(omnitoken.Config{
47+
Vault: vault,
48+
Logger: logger,
49+
})
50+
if err != nil {
51+
log.Fatalf("failed to create token manager: %v", err)
52+
}
53+
defer func() {
54+
if err := mgr.Close(); err != nil {
55+
logger.Error("failed to close token manager", "error", err)
56+
}
57+
}()
58+
59+
// Pre-populate credentials (in production, these would be loaded from vault)
60+
services := map[string]*goauth.Credentials{
61+
"github": {
62+
Service: "github",
63+
Type: goauth.TypeOAuth2,
64+
OAuth2: &goauth.CredentialsOAuth2{
65+
ClientID: os.Getenv("GITHUB_CLIENT_ID"),
66+
ClientSecret: os.Getenv("GITHUB_CLIENT_SECRET"),
67+
GrantType: "client_credentials",
68+
Scopes: []string{"repo", "user"},
69+
},
70+
},
71+
"slack": {
72+
Service: "slack",
73+
Type: goauth.TypeOAuth2,
74+
OAuth2: &goauth.CredentialsOAuth2{
75+
ClientID: os.Getenv("SLACK_CLIENT_ID"),
76+
ClientSecret: os.Getenv("SLACK_CLIENT_SECRET"),
77+
GrantType: "client_credentials",
78+
},
79+
},
80+
"internal-api": {
81+
Service: "internal-api",
82+
Type: goauth.TypeBasic,
83+
Basic: &goauth.CredentialsBasicAuth{
84+
Username: os.Getenv("API_USERNAME"),
85+
Password: os.Getenv("API_PASSWORD"),
86+
ServerURL: os.Getenv("API_SERVER_URL"),
87+
},
88+
},
89+
}
90+
91+
for name, creds := range services {
92+
if err := mgr.SetCredentials(ctx, name, creds); err != nil {
93+
logger.Warn("failed to store credentials", "name", name, "error", err)
94+
}
95+
}
96+
97+
// Create tool context for MCP tools
98+
toolCtx := &ToolContext{
99+
tokenMgr: mgr,
100+
logger: logger,
101+
}
102+
103+
// Example: Tool that uses GitHub API
104+
fmt.Println("=== GitHub Tool Example ===")
105+
if client, err := toolCtx.GetClient(ctx, "github"); err != nil {
106+
fmt.Printf("Failed to get GitHub client: %v\n", err)
107+
} else {
108+
fmt.Printf("Got GitHub client: %T\n", client)
109+
// In real code: resp, err := client.Get("https://api.github.com/user/repos")
110+
}
111+
112+
// Example: Tool that uses internal API with basic auth
113+
fmt.Println("\n=== Internal API Tool Example ===")
114+
if creds, err := toolCtx.GetCredentials(ctx, "internal-api"); err != nil {
115+
fmt.Printf("Failed to get internal API credentials: %v\n", err)
116+
} else {
117+
fmt.Printf("Got credentials for: %s (type: %s)\n", creds.Service, creds.Type)
118+
}
119+
120+
// List all available services
121+
fmt.Println("\n=== Available Services ===")
122+
names, err := mgr.ListCredentials(ctx)
123+
if err != nil {
124+
log.Fatalf("failed to list credentials: %v", err)
125+
}
126+
for _, name := range names {
127+
creds, _ := mgr.GetCredentials(ctx, name)
128+
fmt.Printf("- %s (type: %s)\n", name, creds.Type)
129+
}
130+
131+
fmt.Println("\nDone!")
132+
}

0 commit comments

Comments
 (0)