मुख्य सामग्री पर जाएं
MCP सर्वर OAuth 2.1 टोकन की आवश्यकता कर सकते हैं। प्रबंधित प्रमाणीकरण और क्रेडेंशियल पृथक्करण के लिए DAuth (Dedalus Auth) चुनें, या अपना स्वयं का ऑथराइज़ेशन सर्वर उपयोग करें।

DAuth (Dedalus Auth)

DAuth Dedalus की managed authorization प्रणाली है। यह OAuth 2.1 टोकन जारी करती है, एक प्रमुख सुरक्षा गुण के साथ: credentials कभी भी sealed execution boundary से बाहर नहीं निकलते

DAuth क्यों?

पारंपरिक क्रेडेंशियल हैंडलिंग में आपके एप्लिकेशन कोड के सामने सीक्रेट्स उजागर हो जाते हैं। DAuth क्रेडेंशियल्स को एक सुरक्षित एन्क्लेव में अलग रखता है—आपके MCP सर्वर को रॉ API कुंजियों के बजाय एक अपारदर्शी कनेक्शन हैंडल प्राप्त होता है।
  • क्रेडेंशियल्स कभी उजागर नहीं होते — Client-side पर एन्क्रिप्टेड, केवल एक सीलबंद execution boundary के भीतर ही डिक्रिप्टेड
  • अपारदर्शी हैंडल्स — आपका कोड कनेक्शनों को हैंडल के ज़रिए संदर्भित करता है, कभी रॉ सीक्रेट्स नहीं देखता
  • Sender-constrained टोकन्स — टोकन क्रिप्टोग्राफ़िक रूप से Client से बंधे होते हैं; चुराए गए टोकन अमान्य/बेकार होते हैं
  • Networkless execution — क्रेडेंशियल डिक्रिप्शन और API कॉल पूरी तरह से एक आइसोलेटेड एन्क्लेव के भीतर ही होते हैं; रॉ सीक्रेट्स कभी भी नेटवर्क पर ट्रांसफ़र नहीं होते

DAuth कैसे काम करता है

जानें कि क्रेडेंशियल आइसोलेशन और सील्ड एक्ज़ीक्यूशन आपके सीक्रेट्स की सुरक्षा कैसे करते हैं।

त्वरित शुरुआत

from dedalus_mcp import MCPServer
from dedalus_mcp.server import AuthorizationConfig

server = MCPServer(
    "protected-server",
    authorization=AuthorizationConfig(
        enabled=True,
        required_scopes=["read"],
    ),
)
डिफ़ॉल्ट रूप से, authorization_servers का मान https://as.dedaluslabs.ai (DAuth कंट्रोल प्लेन) पर सेट होता है। GitHub और Supabase इंटीग्रेशन के साथ एक पूरी तरह कार्यशील उदाहरण के लिए:

उदाहरण MCP सर्वर

GitHub और Supabase इंटीग्रेशन वाला प्रोडक्शन के लिए तैयार सर्वर।
बिना प्रमाणीकरण वाले अनुरोधों पर 401 लौटाया जाता है, जिसमें WWW-Authenticate चैलेंज सुरक्षित संसाधन के मेटाडेटा की ओर संकेत करता है।

सर्वर स्तर के स्कोप

सभी रिक्वेस्ट के लिए ये स्कोप अनिवार्य हैं। स्कोप नाम वे मनचाही स्ट्रिंग्स होते हैं जिन्हें आप खुद परिभाषित करते हैं—आम पैटर्न सामान्य एक्सेस के लिए read/write या सूक्ष्म नियंत्रण के लिए resource:action (जैसे files:delete) होते हैं।
authorization=AuthorizationConfig(
    enabled=True,
    required_scopes=["read", "write"],  # सभी tools के लिए अनिवार्य

प्रत्येक टूल के लिए scopes

संवेदनशील टूल्स को अतिरिक्त scope आवश्यकताओं के साथ सुरक्षित करें:
from dedalus_mcp import tool

@tool(description="List files")
def list_files(path: str) -> list[str]:
    return os.listdir(path)  # कोई अतिरिक्त स्कोप की आवश्यकता नहीं

@tool(description="Delete file", required_scopes=["files:delete"])
def delete_file(path: str) -> dict:
    os.remove(path)
    return {"deleted": path}
read अनुमति वाला टोकन list_files को कॉल कर सकता है। files:delete अनुमति के बिना delete_file को कॉल करने पर त्रुटि मिलती है:
{
  "isError": true,
  "content": [{
    "type": "text",
    "text": "Tool \"delete_file\" requires scopes: ['files:delete']. Missing: ['files:delete']"
  }]
}

कॉन्फ़िगरेशन विकल्प

AuthorizationConfig(
    enabled=True,
    authorization_servers=["https://as.dedaluslabs.ai"],  # DAuth (डिफ़ॉल्ट)
    required_scopes=["read"],
    metadata_path="/.well-known/oauth-protected-resource",
    cache_ttl=300,
    fail_open=False,
)
विकल्पडिफ़ॉल्टविवरण
enabledFalseऑथराइज़ेशन प्रवर्तन सक्षम करें
authorization_servers["https://as.dedaluslabs.ai"]DAuth या कस्टम OAuth AS URL
required_scopes[]सभी अनुरोधों के लिए आवश्यक स्कोप
metadata_path/.well-known/oauth-protected-resourcePRM एंडपॉइंट का पथ
cache_ttl300मेटाडेटा के लिए कैश अवधि
fail_openFalseसत्यापन विफल होने पर भी अनुरोधों की अनुमति दें

टूल्स में एक्सेस क्लेम्स

अपने टूल्स में प्रमाणित उपयोगकर्ता की जानकारी जाँचें:
from dedalus_mcp import tool, get_context

@tool(description="Get current user")
def whoami() -> dict:
    ctx = get_context()
    auth = ctx.auth  # AuthorizationContext या None

    if auth is None:
        return {"user": "anonymous"}

    return {
        "subject": auth.subject,
        "scopes": auth.scopes,
        "claims": auth.claims,
    }

DPoP समर्थन

DAuth डिफ़ॉल्ट रूप से DPoP (Demonstrating Proof-of-Possession) का उपयोग करता है। टोकन क्रिप्टोग्राफ़िक रूप से Client की key से बंधे होते हैं—यदि कोई टोकन चोरी हो भी जाए, तो संबंधित private key के बिना वह बेकार है।
server = MCPServer(
    "dpop-server",
    authorization=AuthorizationConfig(
        enabled=True,
        dpop_required=True,
    ),
)

Environment variable

ध्यान रखें कि इन वेरिएबल्स को अपने एनवायरमेंट में जोड़ें। DAuth, Dedalus SDK (सॉफ्टवेयर डेवलपमेंट किट) के साथ नैटिव रूप से काम करता है, इसलिए एक API कुंजी आवश्यक है। अपनी API कुंजी डैशबोर्ड से प्राप्त करें।
# Dedalus प्लेटफ़ॉर्म (_client.py परीक्षण के लिए)
DEDALUS_API_KEY=dsk-live-...
DEDALUS_API_URL=https://api.dedaluslabs.ai
DEDALUS_AS_URL=https://as.dedaluslabs.ai

बाहरी ऑथराइज़ेशन सर्वर

मौजूदा पहचान (identity) इंफ्रास्ट्रक्चर के साथ इंटीग्रेशन करते समय आप DAuth की बजाय अपना खुद का OAuth 2.1 प्रोवाइडर उपयोग कर सकते हैं।
बाहरी ऑथराइज़ेशन सर्वर sealed execution मॉडल उपलब्ध नहीं कराते। आपके MCP सर्वर को क्रेडेंशियल्स को सीधे संभालना होगा।

कस्टम प्रोवाइडर

from dedalus_mcp.server import AuthorizationConfig, JWTValidatorConfig, JWTValidator

server = MCPServer(
    "my-server",
    authorization=AuthorizationConfig(
        enabled=True,
        authorization_servers=["https://auth.mycompany.com"],
        required_scopes=["api:access"],
    ),
)

# अपने प्रोवाइडर के लिए JWT सत्यापन को कॉन्फ़िगर करें
jwt_config = JWTValidatorConfig(
    jwks_uri="https://auth.mycompany.com/.well-known/jwks.json",
    issuer="https://auth.mycompany.com",
    audience="https://my-mcp-server.example.com",
)

server.set_authorization_provider(JWTValidator(jwt_config))

Auth0

jwt_config = JWTValidatorConfig(
    jwks_uri="https://YOUR_DOMAIN.auth0.com/.well-known/jwks.json",
    issuer="https://YOUR_DOMAIN.auth0.com/",
    audience="https://my-mcp-api",
)

Okta

jwt_config = JWTValidatorConfig(
    jwks_uri="https://YOUR_DOMAIN.okta.com/oauth2/default/v1/keys",
    issuer="https://YOUR_DOMAIN.okta.com/oauth2/default",
    audience="api://my-mcp-server",
)

Keycloak

jwt_config = JWTValidatorConfig(
    jwks_uri="https://keycloak.example.com/realms/myrealm/protocol/openid-connect/certs",
    issuer="https://keycloak.example.com/realms/myrealm",
    audience="my-mcp-client",
)

परीक्षण

पूर्ण server और Client के साथ authorization का परीक्षण करें:
import pytest
from dedalus_mcp import MCPServer, tool
from dedalus_mcp.server import AuthorizationConfig
from dedalus_mcp.client import MCPClient, BearerAuth

@tool(description="फ़ाइल हटाएं", required_scopes=["files:delete"])
def delete_file(path: str) -> dict:
    return {"deleted": path}

@pytest.fixture
async def protected_server():
    server = MCPServer(
        "test",
        authorization=AuthorizationConfig(enabled=True, required_scopes=["read"]),
    )
    server.collect(delete_file)
    task = asyncio.create_task(server.serve())
    await asyncio.sleep(0.1)
    yield server
    task.cancel()

async def test_with_valid_token(protected_server):
    # आवश्यक स्कोप वाले टेस्ट टोकन का उपयोग करें
    client = await MCPClient.connect(
        "http://127.0.0.1:8000/mcp",
        auth=BearerAuth(access_token="test-token-with-scopes")
    )
    result = await client.call_tool("delete_file", {"path": "/tmp/test.txt"})
    await client.close()