micro--go-micro
ac47a4650a
* Initial plan
* Add MCP per-tool scopes, tracing, rate limiting, and audit logging
- Add Scopes field to Tool struct for per-tool scope requirements
- Add Auth (auth.Auth) integration to Options for token inspection
- Add trace ID generation (UUID) propagated via metadata to downstream RPCs
- Add per-tool rate limiting with configurable requests/sec and burst
- Add AuditFunc callback for immutable tool-call audit records
- Extract tool scopes from registry endpoint metadata ("scopes" key)
- Update both HTTP and stdio transports with auth/trace/rate/audit
- Add comprehensive tests for all new functionality
Co-authored-by: asim <17530+asim@users.noreply.github.com>
* Revert unrelated example go.mod changes
Co-authored-by: asim <17530+asim@users.noreply.github.com>
* Remove auto-generated example go.sum files
Co-authored-by: asim <17530+asim@users.noreply.github.com>
* Add WithEndpointScopes helper, gateway-level ToolScopes, and documentation
- Add server.WithEndpointScopes() for declaring per-endpoint auth scopes at
handler registration time
- Add mcp.Options.ToolScopes for gateway-level scope overrides without
changing individual services
- Update documented example to show WithEndpointScopes usage
- Update examples/mcp/README.md with scopes, tracing, and rate-limiting docs
- Update gateway/mcp/DOCUMENTATION.md with scopes section and FAQ
- Add tests for both new features
Co-authored-by: asim <17530+asim@users.noreply.github.com>
* Fix ToolScopes doc comment: clarify override (not merge) semantics
Co-authored-by: asim <17530+asim@users.noreply.github.com>
* Revert unrelated example go.mod/go.sum changes
Co-authored-by: asim <17530+asim@users.noreply.github.com>
* Rename ToolScopes to Scopes in MCP Options
The field name "Scopes" is more universal and consistent with how
auth scopes are used throughout go-micro. Updated all code references,
tests, and documentation.
Co-authored-by: asim <17530+asim@users.noreply.github.com>
* MCP gateway: add per-tool scopes, tracing, rate limiting, and audit logging
Co-authored-by: asim <17530+asim@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: asim <17530+asim@users.noreply.github.com>
52 行
1.0 KiB
Go
52 行
1.0 KiB
Go
package mcp
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// rateLimiter implements a simple token-bucket rate limiter.
|
|
type rateLimiter struct {
|
|
mu sync.Mutex
|
|
rate float64 // tokens per second
|
|
burst int // max tokens
|
|
tokens float64 // current token count
|
|
lastTime time.Time // last refill time
|
|
}
|
|
|
|
// newRateLimiter creates a rate limiter that allows rate requests/sec with
|
|
// the given burst size. If burst is less than 1 it defaults to 1.
|
|
func newRateLimiter(rate float64, burst int) *rateLimiter {
|
|
if burst < 1 {
|
|
burst = 1
|
|
}
|
|
return &rateLimiter{
|
|
rate: rate,
|
|
burst: burst,
|
|
tokens: float64(burst),
|
|
lastTime: time.Now(),
|
|
}
|
|
}
|
|
|
|
// Allow reports whether a single event may happen now.
|
|
func (r *rateLimiter) Allow() bool {
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
|
|
now := time.Now()
|
|
elapsed := now.Sub(r.lastTime).Seconds()
|
|
r.lastTime = now
|
|
|
|
// Refill tokens based on elapsed time
|
|
r.tokens += elapsed * r.rate
|
|
if r.tokens > float64(r.burst) {
|
|
r.tokens = float64(r.burst)
|
|
}
|
|
|
|
if r.tokens < 1 {
|
|
return false
|
|
}
|
|
r.tokens--
|
|
return true
|
|
}
|