Add your description here
Project description
belgie-mcp
[!WARNING] This package follows the current MCP Python SDK auth APIs. Expect small compatibility updates as the SDK evolves.
belgie-mcp is the MCP bridge for Belgie OAuth. It builds MCP AuthSettings,
provides a TokenVerifier, and helps resource servers publish Better
Auth-style protected-resource metadata.
OAuth protocol behavior still lives in belgie-oauth-server. belgie-mcp
only adapts that behavior into MCP-facing types.
There is no separate ASGI mcp_handler export: use MCPServer(..., token_verifier=..., auth=...) and
streamable_http_app(...) so the MCP Python SDK performs Bearer verification,
scope checks, and 401/403 responses (the analogue of a Fetch-level mcpHandler
in the Node stack).
Installation
uv add belgie[mcp] belgie[oauth]
Quick Start
from fastapi import FastAPI
from fastapi.responses import JSONResponse
from mcp.server.mcpserver import MCPServer
from belgie import Belgie
from belgie.mcp import Mcp
from belgie.oauth.server import OAuthServer
app = FastAPI()
belgie = Belgie(
settings=...,
adapter=...,
database=...,
)
oauth_settings = OAuthServer(
adapter=...,
base_url="https://auth.local",
login_url="/login",
consent_url="/consent",
valid_audiences=["https://app.local/mcp"],
)
_ = belgie.add_plugin(oauth_settings)
mcp_plugin = belgie.add_plugin(
Mcp(
oauth=oauth_settings,
base_url="https://app.local",
),
)
mcp_server = MCPServer(
name="Belgie MCP",
instructions="MCP server protected by Belgie OAuth",
token_verifier=mcp_plugin.token_verifier,
auth=mcp_plugin.auth,
)
app.include_router(belgie.router)
app.mount(
mcp_plugin.server_path,
mcp_server.streamable_http_app(streamable_http_path="/"),
)
@app.get("/.well-known/oauth-protected-resource")
async def protected_resource_metadata() -> JSONResponse:
metadata = mcp_plugin.protected_resource_metadata(scopes_supported=["user"])
return JSONResponse(metadata.model_dump(mode="json", exclude_none=True))
@mcp_server.tool()
async def get_time() -> dict[str, str]:
return {"current_time": "2026-04-21T00:00:00+00:00"}
Resource Metadata Flow
This package follows the usual protected-resource split:
- the auth server publishes OAuth and OIDC discovery metadata
- the MCP server publishes
/.well-known/oauth-protected-resource
Use McpPlugin.protected_resource_metadata(...) to build that document from the
same OAuth settings that power the verifier.
Configuration Notes
server_urltakes precedence overbase_urlplusserver_path.- If
server_urlis omitted,Mcpderives it frombase_urlandserver_path. oauth_strict=Trueenables strict audience checks during verification.required_scopesapplies MCP-side scope checks after token verification.mcp_token_verifier(...)defaults remote introspection to{issuer}/oauth2/introspect.- If you need remote introspection, set
introspection_endpoint,introspection_client_id, andintrospection_client_secret. resource_metadata_mappingsmaps non-URL audience strings (e.g. URNs) to a full protected-resource metadata URL. Use withMcpPlugin.mcp_www_authenticate_value(...)orbuild_mcp_www_authenticate_value(...)when you return 401 responses outsideMCPServer.streamable_http_app(the SDK still setswww-authenticatefor you).
Public Surface
The primary public surface is:
McpMcpPluginBelgieOAuthTokenVerifiermcp_authmcp_token_verifierbuild_mcp_www_authenticate_value
The older top-level get_user_from_access_token helper is no longer part of
the recommended public API. If you need application-specific subject-to-user
resolution, build that lookup from the verified token payload in your own app.
Compatibility Notes
- The removed
prefix="/oauth"andOAuthServerResourcesetup does not come back here. - Protected-resource metadata is resource-server-owned.
belgie-mcpdoes not add auth-server-owned fallback metadata routes. - The bundled verifier follows the OAuth server metadata contract, so its
default introspection URL matches
belgie-oauth-serverdiscovery output.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file belgie_mcp-0.19.3.tar.gz.
File metadata
- Download URL: belgie_mcp-0.19.3.tar.gz
- Upload date:
- Size: 6.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6926c5b111227624257953a6353aeae5ba659d073c0e4a4d5974e3c795e09d0a
|
|
| MD5 |
0ef4e760ccdcc7d7eee27ba8aad88605
|
|
| BLAKE2b-256 |
81e0bdf5a3ea896ab8eea474f11fff69fa0023d25a2c0015ae9ca1ab516ca134
|
File details
Details for the file belgie_mcp-0.19.3-py3-none-any.whl.
File metadata
- Download URL: belgie_mcp-0.19.3-py3-none-any.whl
- Upload date:
- Size: 9.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e1b342b838202a106459f98e895ad9877b6e7ddb7a981598a2816c16b94afaa4
|
|
| MD5 |
a387815b119948fe010cedc69306646d
|
|
| BLAKE2b-256 |
964d8a5c4e0c8244693582d47936b17ff999b77f6d581de86d5b2618b8dd0bef
|