Members can now attach external tool servers to their chats (Settings →
Services → Integrations → External Tool Servers) — but only services that
speak the OpenAPI protocol. The Type selector in the add dialog is
deliberately OpenAPI-only for personal connections ({#if !direct} in AddToolServerModal.svelte — same in upstream latest), so MCP servers
cannot be added by members, only by admins via the shared admin
configuration (tool_server.connections).
This surfaced when a member tried to connect two different marketplace-search
services (secondhand-mcp, socialapis.io) — both are MCP-only (no OpenAPI
spec published), so neither is member-addable. The member's goal is legitimate
and low-risk: read-only searches of public marketplace data under their own
account and quota.
Why this matters
Tool integrations are exactly the kind of member-driven experimentation the
co-op wants to encourage, and the current design makes every non-OpenAPI
integration an admin ticket.
Admin-added MCP servers are co-op-wide and share a single credential:
either the co-op owns the API key (cost, quota, and a shared privacy
posture members didn't individually consent to) or a member's personal key
gets configured co-op-wide (their quota, visible to everyone — clearly
wrong).
The OpenAI-style "bring your own key" model fits the co-op well: members
already manage their own API keys in the dashboard.
Current state (verified 2026-10-13)
Open WebUI 0.12.0; features.direct_tool_servers enabled platform-wide.
Personal connections: OpenAPI-only by design (upstream behaves the same
in the latest AddToolServerModal.svelte).
Admin MCP connections work fine (verified with two external MCP services).
Potential solutions (in order of preference)
1. Allow the MCP type for personal (direct) connections
Lift the {#if !direct} restriction so the Type toggle renders for members.
Members add MCP servers under their own accounts; the platform already
enforces the direct_tool_servers permission server-side (user-supplied
tool servers are stripped from requests when the permission is absent, so the
boundary is real).
Security considerations (accepted by the co-op's "high trust community"
posture, but worth noting upstream): a member's MCP server sees the content
of chats it's attached to, and the server makes outbound calls to
member-specified URLs. These are the member's own risk surface — the same
trust model as personal OpenAPI connections, which already have both
properties.
2. Co-op-hosted OpenAPI wrapper bridge
The co-op hosts a small OpenAPI-compatible proxy that forwards to arbitrary
MCP services configured by the operator. Members connect to the wrapper with their own upstream API key (passed per-request), keeping accounts
per-member. This works within today's constraints but is real infrastructure:
hosting, maintenance, and a trust boundary (the wrapper sees member keys).
3. Admin-added per-request keys
Keep MCP admin-curated, but allow an admin-added MCP server to prompt the
member for their own API key at use time (per-member key storage for a shared
server definition). Avoids shared credentials without changing the connection
model.
What we'd love from upstream/maintainers
A steer on whether personal MCP connections are on the roadmap, and if the {#if !direct} restriction is a deliberate trust boundary or just an early
default. Happy to test a build or provide more detail on our setup
(Cloudron-packaged 0.12.0, SSO, ~25 members, tool servers over
streamable-http verified working from our network).
## The problem
Members can now attach **external tool servers** to their chats (Settings →
Services → Integrations → External Tool Servers) — but only services that
speak the **OpenAPI** protocol. The **Type** selector in the add dialog is
deliberately OpenAPI-only for personal connections (`{#if !direct}` in
`AddToolServerModal.svelte` — same in upstream latest), so **MCP servers
cannot be added by members**, only by admins via the shared admin
configuration (`tool_server.connections`).
This surfaced when a member tried to connect two different marketplace-search
services (secondhand-mcp, socialapis.io) — both are **MCP-only** (no OpenAPI
spec published), so neither is member-addable. The member's goal is legitimate
and low-risk: read-only searches of public marketplace data under their own
account and quota.
## Why this matters
- Tool integrations are exactly the kind of member-driven experimentation the
co-op wants to encourage, and the current design makes every non-OpenAPI
integration an admin ticket.
- Admin-added MCP servers are **co-op-wide and share a single credential**:
either the co-op owns the API key (cost, quota, and a shared privacy
posture members didn't individually consent to) or a member's personal key
gets configured co-op-wide (their quota, visible to everyone — clearly
wrong).
- The OpenAI-style "bring your own key" model fits the co-op well: members
already manage their own API keys in the dashboard.
## Current state (verified 2026-10-13)
- Open WebUI 0.12.0; `features.direct_tool_servers` enabled platform-wide.
- Personal connections: **OpenAPI-only by design** (upstream behaves the same
in the latest `AddToolServerModal.svelte`).
- Admin MCP connections work fine (verified with two external MCP services).
## Potential solutions (in order of preference)
### 1. Allow the MCP type for personal (direct) connections
Lift the `{#if !direct}` restriction so the Type toggle renders for members.
Members add MCP servers under their own accounts; the platform already
enforces the `direct_tool_servers` permission server-side (user-supplied
tool servers are stripped from requests when the permission is absent, so the
boundary is real).
Security considerations (accepted by the co-op's "high trust community"
posture, but worth noting upstream): a member's MCP server sees the content
of chats it's attached to, and the server makes outbound calls to
member-specified URLs. These are the member's own risk surface — the same
trust model as personal OpenAPI connections, which already have both
properties.
### 2. Co-op-hosted OpenAPI wrapper bridge
The co-op hosts a small OpenAPI-compatible proxy that forwards to arbitrary
MCP services configured by the operator. Members connect to the wrapper with
**their own upstream API key** (passed per-request), keeping accounts
per-member. This works within today's constraints but is real infrastructure:
hosting, maintenance, and a trust boundary (the wrapper sees member keys).
### 3. Admin-added per-request keys
Keep MCP admin-curated, but allow an admin-added MCP server to prompt the
member for their own API key at use time (per-member key storage for a shared
server definition). Avoids shared credentials without changing the connection
model.
## What we'd love from upstream/maintainers
A steer on whether personal MCP connections are on the roadmap, and if the
`{#if !direct}` restriction is a deliberate trust boundary or just an early
default. Happy to test a build or provide more detail on our setup
(Cloudron-packaged 0.12.0, SSO, ~25 members, tool servers over
streamable-http verified working from our network).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The problem
Members can now attach external tool servers to their chats (Settings →
Services → Integrations → External Tool Servers) — but only services that
speak the OpenAPI protocol. The Type selector in the add dialog is
deliberately OpenAPI-only for personal connections (
{#if !direct}inAddToolServerModal.svelte— same in upstream latest), so MCP serverscannot be added by members, only by admins via the shared admin
configuration (
tool_server.connections).This surfaced when a member tried to connect two different marketplace-search
services (secondhand-mcp, socialapis.io) — both are MCP-only (no OpenAPI
spec published), so neither is member-addable. The member's goal is legitimate
and low-risk: read-only searches of public marketplace data under their own
account and quota.
Why this matters
co-op wants to encourage, and the current design makes every non-OpenAPI
integration an admin ticket.
either the co-op owns the API key (cost, quota, and a shared privacy
posture members didn't individually consent to) or a member's personal key
gets configured co-op-wide (their quota, visible to everyone — clearly
wrong).
already manage their own API keys in the dashboard.
Current state (verified 2026-10-13)
features.direct_tool_serversenabled platform-wide.in the latest
AddToolServerModal.svelte).Potential solutions (in order of preference)
1. Allow the MCP type for personal (direct) connections
Lift the
{#if !direct}restriction so the Type toggle renders for members.Members add MCP servers under their own accounts; the platform already
enforces the
direct_tool_serverspermission server-side (user-suppliedtool servers are stripped from requests when the permission is absent, so the
boundary is real).
Security considerations (accepted by the co-op's "high trust community"
posture, but worth noting upstream): a member's MCP server sees the content
of chats it's attached to, and the server makes outbound calls to
member-specified URLs. These are the member's own risk surface — the same
trust model as personal OpenAPI connections, which already have both
properties.
2. Co-op-hosted OpenAPI wrapper bridge
The co-op hosts a small OpenAPI-compatible proxy that forwards to arbitrary
MCP services configured by the operator. Members connect to the wrapper with
their own upstream API key (passed per-request), keeping accounts
per-member. This works within today's constraints but is real infrastructure:
hosting, maintenance, and a trust boundary (the wrapper sees member keys).
3. Admin-added per-request keys
Keep MCP admin-curated, but allow an admin-added MCP server to prompt the
member for their own API key at use time (per-member key storage for a shared
server definition). Avoids shared credentials without changing the connection
model.
What we'd love from upstream/maintainers
A steer on whether personal MCP connections are on the roadmap, and if the
{#if !direct}restriction is a deliberate trust boundary or just an earlydefault. Happy to test a build or provide more detail on our setup
(Cloudron-packaged 0.12.0, SSO, ~25 members, tool servers over
streamable-http verified working from our network).