Skip to main content
Glama
Bin4yi

MCP Authentication Example

by Bin4yi

Pawsome Pet Care - AI-Powered Veterinary Assistant with Asgardeo Authentication

This project demonstrates a sophisticated AI-powered pet care chatbot system that integrates a secured MCP (Model Context Protocol) server with an intelligent LangGraph agent, using Asgardeo as the OAuth2/OIDC provider for authentication and authorization.

🌟 Key Features

  • Secure MCP Server with Asgardeo OAuth2 authentication

  • Intelligent LangGraph Agent with dynamic context management

  • Multi-Pet Context Handling with automatic pet selection logic

  • JWT Token Validation with JWKS endpoint integration

  • OpenAI Integration for AI-powered pet name suggestions

  • RESTful Web Interface with CORS support

  • Real-time Chat with conversation memory

Prerequisites

  • Python 3.12 or higher

  • Asgardeo account and application setup

  • OpenAI API key (for pet name suggestions)

  • pip (Python package installer)

Project Structure

ā”œā”€ā”€ main.py              # FastMCP server with secured endpoints
ā”œā”€ā”€ agent.py            # LangGraph agent with dynamic context logic
ā”œā”€ā”€ jwt_validator.py    # JWT validation module for Asgardeo tokens
ā”œā”€ā”€ index.html          # Web interface for chat
ā”œā”€ā”€ .env                # Environment variables configuration
ā”œā”€ā”€ requirements.txt    # Python dependencies
└── README.md          # This file

Installation

  1. Clone or download this project

  2. Create a virtual environment (recommended)

    python -m venv .venv
    source .venv/bin/activate  # On Windows: .venv\Scripts\activate
  3. Install required dependencies

    pip install -r requirements.txt

    Key dependencies include:

    • fastmcp - Fast MCP server framework

    • python-dotenv - Environment variable management

    • openai - OpenAI API integration

    • pyjwt - JWT token handling

    • langgraph - Agent orchestration

    • langchain-openai - OpenAI LangChain integration

    • aiohttp - Async HTTP server

    • httpx - HTTP client

  4. Configure environment variables

    Create a .env file in the project root directory:

    # Asgardeo OAuth2 Configuration
    
    ## Asgardeo Configuration
    
    ## 1. Create an Asgardeo Application
    
       1. Login to your [Asgardeo](https://asgardeo.io/) account.
       2. Navigate to the **Applications** tab and select the **MCP Client Application**.
       3. Add your application name and callback URL.
    
    ## 2. Get Your Application Credentials

Once the application is created, get both the Client ID and Tenant Name:

  • Client ID: Found in the application's Protocol tab.

  • Tenant Name: Your organization's tenant name (visible in the URL). AUTH_ISSUER=https://api.asgardeo.io/t/ CLIENT_ID= JWKS_URL=https://api.asgardeo.io/t//oauth2/jwks

    OpenAI Configuration

    OPENAI_API_KEY=

    
    **Example with actual values:**
    ```bash
    # Asgardeo OAuth2 Configuration
    AUTH_ISSUER=https://api.asgardeo.io/t/pawsomepets
    CLIENT_ID=abc123xyz789_client_id_from_asgardeo
    JWKS_URL=https://api.asgardeo.io/t/pawsomepets/oauth2/jwks
    
    # OpenAI Configuration
    OPENAI_API_KEY=sk-proj-abc123xyz789

šŸ” Asgardeo Configuration

1. Create an MCP Client Application in Asgardeo

  1. Login to your Asgardeo account at https://console.asgardeo.io

  2. Navigate to the Applications tab and select MCP Client Application template

    MCP Client App Selection

  3. Configure your application:

    • Application Name: Pawsome Pet Care MCP

    • Authorized Redirect URLs: Add the callback URL for your client application

      • For MCP Inspector: http://localhost:6274/oauth/callback

      • For the agent: http://localhost:8080/callback

    MCP Client Creation

2. Get Your Application Credentials

Once the application is created, retrieve the following:

  • Client ID: Found in the application's Protocol tab

  • Tenant Name: Your organization's tenant name (e.g., pawsomepets)

3. Configure Required Scopes

Ensure your Asgardeo application has the following scopes enabled:

  • openid - Standard OpenID Connect scope

  • email - User email address access

  • profile - User profile information

  • internal_login - Required for user authentication

4. Update Environment Variables

Replace the placeholders in your .env file:

  • Replace <your-tenant> with your actual Asgardeo tenant name

  • Replace <your-client-id> with your OAuth2 client ID from Asgardeo

Security Note: Never commit your .env file to version control. Add .env to your .gitignore file.

Architecture Overview

MCP Server (main.py)

The MCP server provides secured tools for pet management:

  1. JWT Token Verification

    • Validates incoming tokens using Asgardeo JWKS endpoint

    • Extracts user claims (subject, scopes, audience)

    • Implements RFC 9728 Protected Resource Metadata

  2. Available Tools:

    • get_user_id_by_email - Retrieves user ID from email

    • get_pets_by_user_id - Lists all pets for a user

    • get_pet_vaccination_info - Fetches vaccination history

    • book_vet_appointment - Books veterinary appointments

    • cancel_appointment - Cancels existing appointments

    • suggest_pet_names - AI-powered pet name suggestions via OpenAI

LangGraph Agent (agent.py)

The agent orchestrates intelligent conversations with dynamic context management:

  1. Authentication Flow

    • Implements OAuth2 Authorization Code Flow with PKCE

    • Automatically opens browser for Asgardeo login

    • Retrieves user email from ID token and SCIM2/Me endpoint

    • Exchanges authorization code for access token

  2. State Management

    • Maintains conversation history per session

    • Caches user context (user ID, pets, active pet)

    • Dynamically resolves pet context from user messages

  3. Graph Nodes:

    • load_context - Loads user data at conversation start

    • classify - Determines user intent

    • mcp_agent - Executes MCP tool calls with dynamic context

    • greeting, services, pricing, general - Intent-specific handlers

  4. Multi-Pet Logic:

    • Single pet: Automatic context selection

    • Multiple pets: Detects pet names in messages or asks for clarification

    • No pets: Informs user appropriately

Running the System

1. Start the MCP Server

python main.py

The server will start on http://localhost:8000 using streamable-http transport.

2. Start the Agent Server

python agent.py

The agent will:

  1. Open your browser for Asgardeo authentication

  2. Wait for authorization callback

  3. Retrieve your user email

  4. Start the chat server on http://localhost:8080

3. Access the Web Interface

Open http://localhost:8080 in your browser to interact with the chatbot.

Testing with MCP Inspector

Setup MCP Inspector

  1. Install and run MCP Inspector:

    npx @modelcontextprotocol/inspector

    Note: Ensure version 0.16.3 or higher.

  2. Configure Inspector Callback:

    • Add http://localhost:6274/oauth/callback to your Asgardeo application's authorized redirect URLs

  3. Connect to MCP Server:

    • Open the Inspector URL (e.g., http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=<token>)

    • Configure the server connection:

      • Transport: HTTP SSE

      • URL: http://localhost:8000/mcp

      • Auth: OAuth2 with Asgardeo settings

    MCP Auth Configs

  4. Test Authentication:

    • Click Connect

    • You'll be redirected to Asgardeo for login

    • After successful authentication, you can test the tools

    MCP Server Connect

Sample Conversation Flows

Example 1: Single Pet User

User: Hi!
Agent: Welcome back! I've loaded your pet details. How can I help?

User: What are Buddy's vaccinations?
Agent: [Automatically calls get_pet_vaccination_info with Buddy's ID]
       Buddy's vaccination records show:
       - Rabies (Jan 15, 2024) - Next due: Jan 15, 2025
       - DHPP (Mar 20, 2024) - Next due: Mar 20, 2025
       - Bordetella (Jun 10, 2024) - Upcoming: Dec 10, 2024

Example 2: Multiple Pet User

User: Show me vaccination info
Agent: Which pet are you referring to? You have:
       - Buddy (Dog)
       - Spot (Dog)

User: Buddy
Agent: [Calls get_pet_vaccination_info with Buddy's ID]
       [Returns vaccination details...]

Example 3: Booking Appointment

User: Book an appointment for Buddy next Monday at 2 PM for checkup
Agent: [Calls book_vet_appointment]
       Appointment confirmed!
       - Pet: Buddy
       - Date: 2025-11-24
       - Time: 2:00 PM
       - Reason: Checkup
       - Veterinarian: Dr. Smith

Security Features

  1. JWT Token Validation

    • Validates tokens against Asgardeo JWKS endpoint

    • Verifies issuer, audience, and expiration

    • Extracts and validates scopes

  2. Authorization Flow

    • OAuth2 Authorization Code Flow with PKCE

    • Secure token exchange

    • No client secret required (PKCE protects public clients)

  3. Scope-Based Access Control

    • Tools require valid access tokens

    • Future enhancement: Scope-specific tool access

  4. User Context Isolation

    • Each user sees only their own pets

    • Session-based conversation memory

    • Context caching per session ID

Troubleshooting

Email Not Retrieved from ID Token

The agent includes fallback logic to retrieve email from SCIM2/Me endpoint if not present in ID token:

# Fallback to SCIM2/Me endpoint
scim_url = f"{base_url}/scim2/Me"
scim_resp = await client.get(
    scim_url,
    headers={"Authorization": f"Bearer {access_token}"}
)

Token Validation Failures

Check the following:

  • JWKS URL is correct and accessible

  • Issuer URL matches exactly (including tenant)

  • Client ID is correct

  • Token has not expired

Connection Issues

  • Ensure MCP server is running on http://localhost:8000

  • Verify agent server is running on http://localhost:8080

  • Check firewall settings for local ports

Advanced Configuration

Custom Port Configuration

Modify port settings in the respective files:

MCP Server (main.py):

mcp.run(transport="streamable-http", port=8000)

Agent Server (agent.py):

site = web.TCPSite(runner, 'localhost', 8080)

Adding New Tools

To add new MCP tools:

  1. Define the tool in main.py:

@mcp.tool()
async def my_new_tool(param: str) -> dict:
    """Tool description"""
    # Implementation
    return {"result": "data"}
  1. The agent will automatically discover and use the new tool.

Contributing

Contributions are welcome! Please ensure:

  • Code follows PEP 8 style guidelines

  • All new tools include proper authentication checks

  • Documentation is updated for new features

License

This project is provided as-is for demonstration purposes.


Powered by Asgardeo - Enterprise-grade identity and access management for modern applications.

-
security - not tested
F
license - not found
-
quality - not tested

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Bin4yi/MCP_Authendication_example'

If you have feedback or need assistance with the MCP directory API, please join our Discord server