a2a-aws-strands-mcp

satishkamavaram/a2a-aws-strands-mcp

3.2

If you are the rightful owner of a2a-aws-strands-mcp and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.

This document provides a comprehensive overview of a Model Context Protocol (MCP) server, detailing its features, tools, resources, usage, and frequently asked questions.

Tools
3
Resources
0
Prompts
0

⚠️ POC DISCLAIMER: This is a Proof of Concept (POC) implementation. Please do not evaluate this code for production-level code structure, modularity, or best practices. This project is designed for educational and demonstration purposes only.

a2a-aws-strands-mcp

Table of contents

A minimal agent system that lets you ask questions about:

  • Weather alerts for German states
  • Jira tickets assigned to a user (and lookup email by user ID)
  • Creating appointments

It consists of:

  • An MCP server exposing tools (weather, Jira, appointments) over Streamable-HTTP
  • An A2A agent server that uses those MCP tools to answer your queries
  • Simple A2A clients (streaming and non‑streaming)

Protocol/stack:

  • MCP (FastMCP), Google A2A SDK, AWS Strands agents

Prerequisites

  • Python 3.10+
  • An OpenAI API key (for the A2A server)

Create a .env file at the project root with:

OPENAI_API_KEY=your_openai_api_key

1) Start the MCP server (port 8001)

From the a2a-aws-strands-mcp/mcp folder:

# Create and activate a virtual environment (macOS zsh)
python3 -m venv .venv
source .venv/bin/activate

# Install dependencies
pip install -r requirements.txt

# Run the MCP server (defaults to http://127.0.0.1:8001)
python mcp_server.py

Example session output will show something like:

satish@Satishs-MacBook-Air mcp % python mcp_server.py 
INFO:root:Server received API_KEY: None
INFO:root:Server received config path: None


╭────────────────────────────────────────────────────────────────────────────╮
│                                                                            │
│        _ __ ___  _____           __  __  _____________    ____    ____     │
│       _ __ ___ .'____/___ ______/ /_/  |/  / ____/ __ \  |___ \  / __ \    │
│      _ __ ___ / /_  / __ `/ ___/ __/ /|_/ / /   / /_/ /  ___/ / / / / /    │
│     _ __ ___ / __/ / /_/ (__  ) /_/ /  / / /___/ ____/  /  __/_/ /_/ /     │
│    _ __ ___ /_/    \____/____/\__/_/  /_/\____/_/      /_____(*)____/      │
│                                                                            │
│                                                                            │
│                                FastMCP  2.0                                │
│                                                                            │
│                                                                            │
│               🖥️  Server name:     jira MCP Server                          │
│               📦 Transport:       Streamable-HTTP                          │
│               🔗 Server URL:      http://127.0.0.1:8001/mcp                │
│                                                                            │
│               🏎️  FastMCP version: 2.12.0                                   │
│               🤝 MCP SDK version: 1.19.0                                   │
│                                                                            │
│               📚 Docs:            https://gofastmcp.com                    │
│               🚀 Deploy:          https://fastmcp.cloud                    │
│                                                                            │
╰────────────────────────────────────────────────────────────────────────────╯


[10/26/25 11:10:44] INFO     Starting MCP server 'jira MCP Server' with transport 'http' on http://127.0.0.1:8001/mcp                                                                             server.py:1571
INFO:     Started server process [70190]
INFO:     Waiting for application startup.
INFO:mcp.server.streamable_http_manager:StreamableHTTP session manager started
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8001 (Press CTRL+C to quit)

2) Start the A2A agent server (port 10001)

From the a2a-aws-strands-mcp/a2a-server folder:

# Create and activate a virtual environment
python3 -m venv .venv
source .venv/bin/activate

# Install dependencies
pip install -r requirements.txt

# Ensure repo-root .env includes your OpenAI key
# OPENAI_API_KEY=your_openai_api_key

# Start the A2A agent server (http://0.0.0.0:10001)
python a2a_jira_server.py

You should see logs like:

satish@Satishs-Air a2a-server % python a2a_jira_server.py
app_url:::::http://0.0.0.0:10001
:::::::api_key:::: {your_openapi_key}
::::::::::::::::::initializing agent
agent card:::::additional_interfaces=None capabilities=AgentCapabilities(extensions=None, push_notifications=None, state_transition_history=None, streaming=True) default_input_modes=['text'] default_output_modes=['text'] description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments' documentation_url=None icon_url=None name='Jira Agent' preferred_transport='JSONRPC' protocol_version='0.3.0' provider=None security=None security_schemes={'oauth2': SecurityScheme(root=OAuth2SecurityScheme(description='', flows=OAuthFlows(authorization_code=None, client_credentials=ClientCredentialsOAuthFlow(refresh_url=None, scopes={'read:test': 'Allows confirming'}, token_url='https://localhost:8080/oauth/token'), implicit=None, password=None), oauth2_metadata_url=None, type='oauth2'))} signatures=None skills=[AgentSkill(description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments', examples=['jira tickets assigned to 1234', 'schedule a appointment on 4th sept 2026 at 4:30 am  from email satish.k@test.com and to these users test1@test.com test2@test.com to discuss about future of agentic AI'], id='jira_agent', input_modes=None, name='Jira Agent', output_modes=None, security=None, tags=['jira'])] supports_authenticated_extended_card=None url='http://0.0.0.0:10001' version='1.0.0'
agent a2a_app:::::<a2a.server.apps.jsonrpc.starlette_app.A2AStarletteApplication object at 0x114eaa3c0>
INFO:     Started server process [77834]
INFO:     Waiting for application startup.
auth agent card:::::additional_interfaces=None capabilities=AgentCapabilities(extensions=None, push_notifications=None, state_transition_history=None, streaming=True) default_input_modes=['text'] default_output_modes=['text'] description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments' documentation_url=None icon_url=None name='Jira Agent' preferred_transport='JSONRPC' protocol_version='0.3.0' provider=None security=None security_schemes={'oauth2': SecurityScheme(root=OAuth2SecurityScheme(description='', flows=OAuthFlows(authorization_code=None, client_credentials=ClientCredentialsOAuthFlow(refresh_url=None, scopes={'read:test': 'Allows confirming'}, token_url='https://localhost:8080/oauth/token'), implicit=None, password=None), oauth2_metadata_url=None, type='oauth2'))} signatures=None skills=[AgentSkill(description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments', examples=['jira tickets assigned to 1234', 'schedule a appointment on 4th sept 2026 at 4:30 am  from email satish.k@test.com and to these users test1@test.com test2@test.com to discuss about future of agentic AI'], id='jira_agent', input_modes=None, name='Jira Agent', output_modes=None, security=None, tags=['jira'])] supports_authenticated_extended_card=None url='http://0.0.0.0:10001' version='1.0.0'
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:10001 (Press CTRL+C to quit)

Agent card (for quick sanity check):


3) Run a client

From the a2a-aws-strands-mcp/a2a-client folder:

# Create and activate a virtual environment
python3 -m venv .venv
source .venv/bin/activate

# Install dependencies
pip install -r requirements.txt

# Run a client
# Non‑streaming
python a2a_jira_client.py

# Streaming
python a2a_jira_client_stream.py

Example interaction (non‑streaming):

satish@Satishs-Air a2a-client % python a2a_jira_client.py
Welcome to the A2A client!
Please enter your query (type 'exit' to quit):
Resolved jira agent card: additional_interfaces=None capabilities=AgentCapabilities(extensions=None, push_notifications=None, state_transition_history=None, streaming=True) default_input_modes=['text'] default_output_modes=['text'] description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments' documentation_url=None icon_url=None name='Jira Agent' preferred_transport='JSONRPC' protocol_version='0.3.0' provider=None security=None security_schemes={'oauth2': SecurityScheme(root=OAuth2SecurityScheme(description='', flows=OAuthFlows(authorization_code=None, client_credentials=ClientCredentialsOAuthFlow(refresh_url=None, scopes={'read:test': 'Allows confirming'}, token_url='https://localhost:8080/oauth/token'), implicit=None, password=None), oauth2_metadata_url=None, type='oauth2'))} signatures=None skills=[AgentSkill(description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments', examples=['jira tickets assigned to 1234', 'schedule a appointment on 4th sept 2026 at 4:30 am  from email satish.k@test.com and to these users test1@test.com test2@test.com to discuss about future of agentic AI'], id='jira_agent', input_modes=None, name='Jira Agent', output_modes=None, security=None, tags=['jira'])] supports_authenticated_extended_card=None url='http://0.0.0.0:10001' version='1.0.0'

User Query:  hi
last_context_id:::: 5001c765e2654ff6b87cb17aee45b913
Request payload JSON:
{
  "message": {
    "role": "user",
    "parts": [
      {
        "type": "text",
        "text": "hi"
      }
    ],
    "message_id": "4392739370b74f46ac38e3aebdd121d1",
    "metadata": {
      "max_tokens": 100
    },
    "context_id": "5001c765e2654ff6b87cb17aee45b913"
  }
}
Response from jira agent (JSON):
{
  "id": "aa873471a9bd4a218962a385d5ae0f7b",
  "jsonrpc": "2.0",
  "result": {
    "artifacts": [
      {
        "artifactId": "4fa62c7e-8794-40bc-8f3d-eb6e6b74b02d",
        "description": "Results of agent",
        "name": "current_result",
        "parts": [
          {
            "kind": "text",
            "text": "Hello! How can I assist you today?"
          }
        ]
      }
    ],
    "contextId": "5001c765e2654ff6b87cb17aee45b913",
    "history": [
      {
        "contextId": "5001c765e2654ff6b87cb17aee45b913",
        "kind": "message",
        "messageId": "4392739370b74f46ac38e3aebdd121d1",
        "metadata": {
          "max_tokens": 100
        },
        "parts": [
          {
            "kind": "text",
            "text": "hi"
          }
        ],
        "role": "user",
        "taskId": "5234b99b-72db-491a-a8f1-1a837a38ef6a"
      }
    ],
    "id": "5234b99b-72db-491a-a8f1-1a837a38ef6a",
    "kind": "task",
    "status": {
      "state": "completed"
    }
  }
}
context_id=5001c765e2654ff6b87cb17aee45b913, task_id=5234b99b-72db-491a-a8f1-1a837a38ef6a
Answer: Hello! How can I assist you today?

Troubleshooting

  • If the client can’t resolve the agent card, ensure the A2A server is running on port 10001.
  • If tools aren’t available, ensure the MCP server is running on port 8001.
  • Ensure your .env has a valid OPENAI_API_KEY before starting the A2A server.

Project layout (key parts)

  • a2a-aws-strands-mcp/mcp/ – MCP server and its requirements
  • a2a-aws-strands-mcp/a2a-server/ – A2A agent server (uses OpenAI + MCP tools)
  • a2a-aws-strands-mcp/a2a-client/ – Clients (streaming and non‑streaming)