ragleap-integrations 0.3.0 (published to PyPI on 2026-10-27)
Added
- McpHub: multi-tenant use. One owner-level McpConfig, one Connection per Scope (hub.connect(scope)), cached, with forget() and max_scopes. Each scope has its own client, tool snapshot and lock; the scope is never a tool argument.
- token_provider(scope, server): called for every request and never cached; a failing or unusable provider gives the constant text MCP token is unavailable.
- allow_for (can only narrow the owner allowlist), policy_for and McpPolicy.approve_scoped (per-tenant approval; without a scope it denies), RateLimit (per tenant, checked before approval and the network) and audit (anything with append(event, data, scope), such as the ragleap-security AuditLog).
- Events from scoped clients carry tenant and scope; arguments and results are never in an event.
- Scope, ScopeError, require_scope, HAS_SECURITY. ragleap-security is an optional extra: pip install ragleap-integrations[security]. Without it a built-in Scope with the same fields and key format is used.
Changed
- Code that does not use McpHub behaves as in 0.2.0. The test extra includes ragleap-security.
Verified
- 331 tests (275 earlier plus 56 new) on Python 3.10 and 3.12; 327 passed and 4 skipped without ragleap-security. 40 of 40 deliberate breaks of the new code caught.
- Live check on 2026-10-26 with the branch source against a third-party public mock MCP auth server: two real tokens, each tenant request carried only its own token, a made-up token got HTTP 401, a changed token affected only its tenant, RateLimit(2, 60) denied the third call locally, no event carried a token. The mock server cannot tell tenants apart, so separation is shown from the requests that were sent.
- Published wheel and sdist checked from PyPI on 2026-10-27: hashes identical to TestPyPI, installed files equal the repository source, the smoke test passes with and without the extra, and the sdist tests pass (331, and 327 with 4 skipped without the extra) against the installed wheel on Python 3.10.12.
Not verified
- approve_scoped, allow_for and policy_for against a real server, a real AuditLog fed by a live run, concurrent tenants against a real server, and a server that really separates the data of tenants. The live check is repeated with the published wheel after release.
Design: packages/ragleap-integrations/docs/design/multi-tenant.md