Skip to content

Commit d9ba2fd

Browse files
authored
Merge branch 'awslabs:main' into main
2 parents 5678baa + 3f3643d commit d9ba2fd

File tree

5 files changed

+1208
-111
lines changed

5 files changed

+1208
-111
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.bedrock_agentcore.yaml
2+
.dockerignore
3+
Dockerfile
4+
invoke_mcp_tools.py
5+
mcp_server.py
6+
my_mcp_client.py
7+
my_mcp_client_remote.py

01-tutorials/01-AgentCore-runtime/02-hosting-MCP-server/hosting_mcp_server.ipynb

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@
287287
"print(\"Setting up Amazon Cognito user pool...\")\n",
288288
"cognito_config = setup_cognito_user_pool()\n",
289289
"print(\"Cognito setup completed ✓\")\n",
290-
"print(f\"User Pool ID: {cognito_config.get('user_pool_id', 'N/A')}\")\n",
290+
"print(f\"User Pool ID: {cognito_config.get('pool_id', 'N/A')}\")\n",
291291
"print(f\"Client ID: {cognito_config.get('client_id', 'N/A')}\")"
292292
]
293293
},
@@ -448,12 +448,45 @@
448448
"import boto3\n",
449449
"import json\n",
450450
"import sys\n",
451+
"import base64\n",
452+
"import time\n",
451453
"from boto3.session import Session\n",
452454
"from datetime import timedelta\n",
455+
"import traceback\n",
453456
"\n",
454457
"from mcp import ClientSession\n",
455458
"from mcp.client.streamable_http import streamablehttp_client\n",
456459
"\n",
460+
"def get_refresh_token(client_id, refresh_token, region):\n",
461+
" \"\"\"Refresh access token using refresh token\"\"\"\n",
462+
" cognito_client = boto3.client('cognito-idp', region_name=region)\n",
463+
" auth_response = cognito_client.initiate_auth(\n",
464+
" ClientId=client_id,\n",
465+
" AuthFlow='REFRESH_TOKEN_AUTH',\n",
466+
" AuthParameters={'REFRESH_TOKEN': refresh_token}\n",
467+
" )\n",
468+
" return auth_response['AuthenticationResult']['AccessToken']\n",
469+
"\n",
470+
"def get_valid_token(bearer_token, client_id, refresh_token, region):\n",
471+
" \"\"\"Check token expiry and refresh if needed\"\"\"\n",
472+
" try:\n",
473+
" payload = bearer_token.split('.')[1]\n",
474+
" payload += '=' * (4 - len(payload) % 4)\n",
475+
" decoded = json.loads(base64.b64decode(payload))\n",
476+
" \n",
477+
" current_time = int(time.time())\n",
478+
" if decoded['exp'] - current_time < 300:\n",
479+
" print(\"🔄 Token expiring soon, refreshing...\")\n",
480+
" new_token = get_refresh_token(client_id, refresh_token, region)\n",
481+
" print(\"✓ Token refreshed successfully\")\n",
482+
" return new_token\n",
483+
" \n",
484+
" return bearer_token\n",
485+
" except Exception as e:\n",
486+
" print(\"🔄 Invalid token, refreshing...\", e)\n",
487+
" traceback.print_exc()\n",
488+
" return get_refresh_token(client_id, refresh_token, region)\n",
489+
"\n",
457490
"async def main():\n",
458491
" boto_session = Session()\n",
459492
" region = boto_session.region_name\n",
@@ -471,7 +504,12 @@
471504
" secret_value = response['SecretString']\n",
472505
" parsed_secret = json.loads(secret_value)\n",
473506
" bearer_token = parsed_secret['bearer_token']\n",
474-
" print(\"✓ Retrieved bearer token from Secrets Manager\")\n",
507+
" refresh_token = parsed_secret['refresh_token']\n",
508+
" client_id = parsed_secret['client_id']\n",
509+
" print(\"✓ Retrieved credentials from Secrets Manager\")\n",
510+
" \n",
511+
" # Validate and refresh token if needed\n",
512+
" bearer_token = get_valid_token(bearer_token, client_id, refresh_token, region)\n",
475513
" \n",
476514
" except Exception as e:\n",
477515
" print(f\"Error retrieving credentials: {e}\")\n",
@@ -571,12 +609,43 @@
571609
"import boto3\n",
572610
"import json\n",
573611
"import sys\n",
612+
"import base64\n",
613+
"import time\n",
574614
"from boto3.session import Session\n",
575615
"from datetime import timedelta\n",
576616
"\n",
577617
"from mcp import ClientSession\n",
578618
"from mcp.client.streamable_http import streamablehttp_client\n",
579619
"\n",
620+
"def get_refresh_token(client_id, refresh_token, region):\n",
621+
" \"\"\"Refresh access token using refresh token\"\"\"\n",
622+
" cognito_client = boto3.client('cognito-idp', region_name=region)\n",
623+
" auth_response = cognito_client.initiate_auth(\n",
624+
" ClientId=client_id,\n",
625+
" AuthFlow='REFRESH_TOKEN_AUTH',\n",
626+
" AuthParameters={'REFRESH_TOKEN': refresh_token}\n",
627+
" )\n",
628+
" return auth_response['AuthenticationResult']['AccessToken']\n",
629+
"\n",
630+
"def get_valid_token(bearer_token, client_id, refresh_token, region):\n",
631+
" \"\"\"Check token expiry and refresh if needed\"\"\"\n",
632+
" try:\n",
633+
" payload = bearer_token.split('.')[1]\n",
634+
" payload += '=' * (4 - len(payload) % 4)\n",
635+
" decoded = json.loads(base64.b64decode(payload))\n",
636+
" \n",
637+
" current_time = int(time.time())\n",
638+
" if decoded['exp'] - current_time < 300:\n",
639+
" print(\"🔄 Token expiring soon, refreshing...\")\n",
640+
" new_token = get_refresh_token(client_id, refresh_token, region)\n",
641+
" print(\"✓ Token refreshed successfully\")\n",
642+
" return new_token\n",
643+
" \n",
644+
" return bearer_token\n",
645+
" except:\n",
646+
" print(\"🔄 Invalid token, refreshing...\")\n",
647+
" return get_refresh_token(client_id, refresh_token, region)\n",
648+
"\n",
580649
"async def main():\n",
581650
" boto_session = Session()\n",
582651
" region = boto_session.region_name\n",
@@ -594,7 +663,12 @@
594663
" secret_value = response['SecretString']\n",
595664
" parsed_secret = json.loads(secret_value)\n",
596665
" bearer_token = parsed_secret['bearer_token']\n",
597-
" print(\"✓ Retrieved bearer token from Secrets Manager\")\n",
666+
" refresh_token = parsed_secret['refresh_token']\n",
667+
" client_id = parsed_secret['client_id']\n",
668+
" print(\"✓ Retrieved credentials from Secrets Manager\")\n",
669+
" \n",
670+
" # Validate and refresh token if needed\n",
671+
" bearer_token = get_valid_token(bearer_token, client_id, refresh_token, region)\n",
598672
" \n",
599673
" except Exception as e:\n",
600674
" print(f\"Error retrieving credentials: {e}\")\n",

0 commit comments

Comments
 (0)