MatteoMass commited on
Commit
a65e06d
·
1 Parent(s): 98ea76a
Files changed (45) hide show
  1. main.py +0 -2
  2. pmcp/mcp_server/{github → github_server}/__init__.py +0 -0
  3. pmcp/mcp_server/github_server/connection_test.py +14 -0
  4. pmcp/mcp_server/{github → github_server}/github.py +2 -2
  5. pmcp/mcp_server/{github → github_server}/mcp_github_main.py +1 -2
  6. pmcp/mcp_server/{github → github_server}/models.py +0 -0
  7. pmcp/mcp_server/{github → github_server}/services/__init__.py +0 -0
  8. pmcp/mcp_server/{github → github_server}/services/branches.py +1 -1
  9. pmcp/mcp_server/{github → github_server}/services/contents.py +0 -0
  10. pmcp/mcp_server/{github → github_server}/services/issues.py +0 -0
  11. pmcp/mcp_server/{github → github_server}/services/pull_requests.py +0 -0
  12. pmcp/mcp_server/{github → github_server}/services/repo.py +1 -1
  13. pmcp/mcp_server/{github → github_server}/services/repo_to_text.py +0 -0
  14. pmcp/mcp_server/{github → github_server}/tools/__init__.py +0 -0
  15. pmcp/mcp_server/{github → github_server}/tools/branches.py +2 -2
  16. pmcp/mcp_server/{github → github_server}/tools/contents.py +2 -2
  17. pmcp/mcp_server/{github → github_server}/tools/issues.py +2 -2
  18. pmcp/mcp_server/{github → github_server}/tools/pull_requests.py +2 -2
  19. pmcp/mcp_server/{github → github_server}/tools/repo.py +2 -2
  20. pmcp/mcp_server/{github → github_server}/tools/repo_to_text.py +2 -2
  21. pmcp/mcp_server/{github → github_server}/tools/tools.py +1 -1
  22. pmcp/mcp_server/{github → github_server}/utils/__init__.py +0 -0
  23. pmcp/mcp_server/{github → github_server}/utils/github_api.py +1 -1
  24. pmcp/mcp_server/{github → github_server}/utils/repo_to_text_utils.py +0 -0
  25. pmcp/mcp_server/{trello → trello_server}/__init__.py +0 -0
  26. pmcp/mcp_server/trello_server/connection_test.py +14 -0
  27. pmcp/mcp_server/{trello → trello_server}/dtos/update_card.py +0 -0
  28. pmcp/mcp_server/{trello → trello_server}/mcp_trello_main.py +2 -2
  29. pmcp/mcp_server/{trello → trello_server}/models.py +0 -0
  30. pmcp/mcp_server/{trello → trello_server}/services/__init__.py +0 -0
  31. pmcp/mcp_server/{trello → trello_server}/services/board.py +2 -2
  32. pmcp/mcp_server/{trello → trello_server}/services/card.py +2 -2
  33. pmcp/mcp_server/{trello → trello_server}/services/checklist.py +1 -1
  34. pmcp/mcp_server/{trello → trello_server}/services/list.py +2 -2
  35. pmcp/mcp_server/{trello → trello_server}/tools/__init__.py +0 -0
  36. pmcp/mcp_server/{trello → trello_server}/tools/board.py +4 -3
  37. pmcp/mcp_server/{trello → trello_server}/tools/card.py +4 -4
  38. pmcp/mcp_server/{trello → trello_server}/tools/checklist.py +2 -2
  39. pmcp/mcp_server/{trello → trello_server}/tools/list.py +3 -3
  40. pmcp/mcp_server/{trello → trello_server}/tools/tools.py +1 -1
  41. pmcp/mcp_server/{trello → trello_server}/trello.py +1 -1
  42. pmcp/mcp_server/{trello → trello_server}/utils/__init__.py +0 -0
  43. pmcp/mcp_server/{trello → trello_server}/utils/trello_api.py +0 -0
  44. pyproject.toml +1 -0
  45. uv.lock +45 -0
main.py CHANGED
@@ -1,6 +1,5 @@
1
  import os
2
  import pprint
3
- from typing import Literal
4
  import uuid
5
  from dotenv import load_dotenv
6
 
@@ -10,7 +9,6 @@ from langgraph.prebuilt import ToolNode
10
  from langgraph.graph import MessagesState, END, StateGraph
11
  from langchain_core.messages import HumanMessage
12
  from langgraph.checkpoint.memory import MemorySaver
13
- from langgraph.types import Command
14
 
15
 
16
  from pmcp.agents.executor import ExecutorAgent
 
1
  import os
2
  import pprint
 
3
  import uuid
4
  from dotenv import load_dotenv
5
 
 
9
  from langgraph.graph import MessagesState, END, StateGraph
10
  from langchain_core.messages import HumanMessage
11
  from langgraph.checkpoint.memory import MemorySaver
 
12
 
13
 
14
  from pmcp.agents.executor import ExecutorAgent
pmcp/mcp_server/{github → github_server}/__init__.py RENAMED
File without changes
pmcp/mcp_server/github_server/connection_test.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastmcp import Client
2
+
3
+ async def main():
4
+ # Connect via stdio to a local script
5
+ async with Client("mcp_github_main.py") as client:
6
+ tools = await client.list_tools()
7
+ print(f"Available tools: {tools}")
8
+ result = await client.call_tool("get_issues", {"owner":"jlowin", "repo":"fastmcp"})
9
+ print(f"Result: {result}")
10
+
11
+
12
+ if __name__ == "__main__":
13
+ import asyncio
14
+ asyncio.run(main())
pmcp/mcp_server/{github → github_server}/github.py RENAMED
@@ -2,13 +2,13 @@ import os
2
 
3
  from dotenv import load_dotenv
4
 
5
- from pmcp.mcp_server.github.utils.github_api import GithubClient
6
 
7
 
8
  # Load environment variables
9
  load_dotenv()
10
 
11
-
12
  # Initialize Github client and service
13
  try:
14
  api_key = os.getenv("GITHUB_API_KEY")
 
2
 
3
  from dotenv import load_dotenv
4
 
5
+ from pmcp.mcp_server.github_server.utils.github_api import GithubClient
6
 
7
 
8
  # Load environment variables
9
  load_dotenv()
10
 
11
+ client = None
12
  # Initialize Github client and service
13
  try:
14
  api_key = os.getenv("GITHUB_API_KEY")
pmcp/mcp_server/{github → github_server}/mcp_github_main.py RENAMED
@@ -3,7 +3,7 @@ import logging
3
  from dotenv import load_dotenv
4
  from mcp.server.fastmcp import FastMCP
5
 
6
- from pmcp.mcp_server.github.tools.tools import register_tools
7
 
8
  # Configure logging
9
  logging.basicConfig(
@@ -22,7 +22,6 @@ mcp = FastMCP("Github MCP Server")
22
  register_tools(mcp)
23
 
24
 
25
-
26
  if __name__ == "__main__":
27
  try:
28
  logger.info("Starting Github MCP Server in Stdio...")
 
3
  from dotenv import load_dotenv
4
  from mcp.server.fastmcp import FastMCP
5
 
6
+ from pmcp.mcp_server.github_server.tools.tools import register_tools
7
 
8
  # Configure logging
9
  logging.basicConfig(
 
22
  register_tools(mcp)
23
 
24
 
 
25
  if __name__ == "__main__":
26
  try:
27
  logger.info("Starting Github MCP Server in Stdio...")
pmcp/mcp_server/{github → github_server}/models.py RENAMED
File without changes
pmcp/mcp_server/{github → github_server}/services/__init__.py RENAMED
File without changes
pmcp/mcp_server/{github → github_server}/services/branches.py RENAMED
@@ -1,4 +1,4 @@
1
- from pmcp.mcp_server.github.utils.github_api import GithubClient
2
 
3
 
4
  class BranchService:
 
1
+ from pmcp.mcp_server.github_server.utils.github_api import GithubClient
2
 
3
 
4
  class BranchService:
pmcp/mcp_server/{github → github_server}/services/contents.py RENAMED
File without changes
pmcp/mcp_server/{github → github_server}/services/issues.py RENAMED
File without changes
pmcp/mcp_server/{github → github_server}/services/pull_requests.py RENAMED
File without changes
pmcp/mcp_server/{github → github_server}/services/repo.py RENAMED
@@ -1,4 +1,4 @@
1
- from pmcp.mcp_server.github.utils.github_api import GithubClient
2
 
3
 
4
  class RepoService:
 
1
+ from pmcp.mcp_server.github_server.utils.github_api import GithubClient
2
 
3
 
4
  class RepoService:
pmcp/mcp_server/{github → github_server}/services/repo_to_text.py RENAMED
File without changes
pmcp/mcp_server/{github → github_server}/tools/__init__.py RENAMED
File without changes
pmcp/mcp_server/{github → github_server}/tools/branches.py RENAMED
@@ -3,8 +3,8 @@ Branch listing tool.
3
  """
4
  from typing import List, Dict
5
  from mcp.server.fastmcp import Context
6
- from pmcp.mcp_server.github.services.branches import BranchService
7
- from pmcp.mcp_server.github import client
8
 
9
  service = BranchService(client)
10
 
 
3
  """
4
  from typing import List, Dict
5
  from mcp.server.fastmcp import Context
6
+ from pmcp.mcp_server.github_server.services.branches import BranchService
7
+ from pmcp.mcp_server.github_server.github import client
8
 
9
  service = BranchService(client)
10
 
pmcp/mcp_server/{github → github_server}/tools/contents.py RENAMED
@@ -4,8 +4,8 @@ Commit and file-content tools.
4
  import base64
5
  from typing import List, Dict
6
  from mcp.server.fastmcp import Context
7
- from pmcp.mcp_server.github.services.contents import ContentService
8
- from pmcp.mcp_server.github import client
9
 
10
  service = ContentService(client)
11
 
 
4
  import base64
5
  from typing import List, Dict
6
  from mcp.server.fastmcp import Context
7
+ from pmcp.mcp_server.github_server.services.contents import ContentService
8
+ from pmcp.mcp_server.github_server.github import client
9
 
10
  service = ContentService(client)
11
 
pmcp/mcp_server/{github → github_server}/tools/issues.py RENAMED
@@ -4,8 +4,8 @@ MCP Tools exposing GitHub issue operations.
4
  from typing import List, Dict, Any
5
  from mcp.server.fastmcp import Context
6
 
7
- from pmcp.mcp_server.github.services.issues import IssueService
8
- from pmcp.mcp_server.github import client
9
 
10
 
11
  service = IssueService(client)
 
4
  from typing import List, Dict, Any
5
  from mcp.server.fastmcp import Context
6
 
7
+ from pmcp.mcp_server.github_server.services.issues import IssueService
8
+ from pmcp.mcp_server.github_server.github import client
9
 
10
 
11
  service = IssueService(client)
pmcp/mcp_server/{github → github_server}/tools/pull_requests.py RENAMED
@@ -3,8 +3,8 @@ Pull-request utilities (read-only).
3
  """
4
  from typing import List, Dict
5
  from mcp.server.fastmcp import Context
6
- from pmcp.mcp_server.github.services.pull_requests import PullRequestService
7
- from pmcp.mcp_server.github import client
8
 
9
  service = PullRequestService(client)
10
 
 
3
  """
4
  from typing import List, Dict
5
  from mcp.server.fastmcp import Context
6
+ from pmcp.mcp_server.github_server.services.pull_requests import PullRequestService
7
+ from pmcp.mcp_server.github_server.github import client
8
 
9
  service = PullRequestService(client)
10
 
pmcp/mcp_server/{github → github_server}/tools/repo.py RENAMED
@@ -2,8 +2,8 @@
2
  Repository-level stats tool.
3
  """
4
  from mcp.server.fastmcp import Context
5
- from pmcp.mcp_server.github.services.repo import RepoService
6
- from pmcp.mcp_server.github import client
7
 
8
 
9
  service = RepoService(client)
 
2
  Repository-level stats tool.
3
  """
4
  from mcp.server.fastmcp import Context
5
+ from pmcp.mcp_server.github_server.services.repo import RepoService
6
+ from pmcp.mcp_server.github_server.github import client
7
 
8
 
9
  service = RepoService(client)
pmcp/mcp_server/{github → github_server}/tools/repo_to_text.py RENAMED
@@ -2,8 +2,8 @@
2
  This module contains tools for managing Github.
3
  """
4
 
5
- from pmcp.mcp_server.github.services.repo_to_text import RepoToTextService
6
- from pmcp.mcp_server.github import client
7
 
8
  from mcp.server.fastmcp import Context
9
 
 
2
  This module contains tools for managing Github.
3
  """
4
 
5
+ from pmcp.mcp_server.github_server.services.repo_to_text import RepoToTextService
6
+ from pmcp.mcp_server.github_server.github import client
7
 
8
  from mcp.server.fastmcp import Context
9
 
pmcp/mcp_server/{github → github_server}/tools/tools.py RENAMED
@@ -2,7 +2,7 @@
2
  This module contains tools for managing Github Issues
3
  """
4
 
5
- from pmcp.mcp_server.github.tools import issues, pull_requests, repo, repo_to_text,branches, contents
6
 
7
 
8
  def register_tools(mcp):
 
2
  This module contains tools for managing Github Issues
3
  """
4
 
5
+ from pmcp.mcp_server.github_server.tools import issues, pull_requests, repo, repo_to_text,branches, contents
6
 
7
 
8
  def register_tools(mcp):
pmcp/mcp_server/{github → github_server}/utils/__init__.py RENAMED
File without changes
pmcp/mcp_server/{github → github_server}/utils/github_api.py RENAMED
@@ -1,6 +1,6 @@
1
  import logging
2
  import httpx
3
- from pmcp.mcp_server.github.utils.repo_to_text_utils import fetch_file_contents, fetch_repo_sha, fetch_repo_tree, format_repo_contents, parse_repo_url
4
 
5
 
6
  GITHUB_API_BASE = "https://api.github.com/repos"
 
1
  import logging
2
  import httpx
3
+ from pmcp.mcp_server.github_server.utils.repo_to_text_utils import fetch_file_contents, fetch_repo_sha, fetch_repo_tree, format_repo_contents, parse_repo_url
4
 
5
 
6
  GITHUB_API_BASE = "https://api.github.com/repos"
pmcp/mcp_server/{github → github_server}/utils/repo_to_text_utils.py RENAMED
File without changes
pmcp/mcp_server/{trello → trello_server}/__init__.py RENAMED
File without changes
pmcp/mcp_server/trello_server/connection_test.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastmcp import Client
2
+
3
+ async def main():
4
+ # Connect via stdio to a local script
5
+ async with Client("mcp_trello_main.py") as client:
6
+ tools = await client.list_tools()
7
+ print(f"Available tools: {tools}")
8
+ result = await client.call_tool("get_boards")
9
+ print(f"Result: {result}")
10
+
11
+
12
+ if __name__ == "__main__":
13
+ import asyncio
14
+ asyncio.run(main())
pmcp/mcp_server/{trello → trello_server}/dtos/update_card.py RENAMED
File without changes
pmcp/mcp_server/{trello → trello_server}/mcp_trello_main.py RENAMED
@@ -3,7 +3,7 @@ import logging
3
  from dotenv import load_dotenv
4
  from mcp.server.fastmcp import FastMCP
5
 
6
- from pmcp.mcp_server.trello.tools.tools import register_tools
7
 
8
  # Configure logging
9
  logging.basicConfig(
@@ -27,7 +27,7 @@ if __name__ == "__main__":
27
  try:
28
  logger.info("Starting Trello MCP Server in Stdio...")
29
  mcp.run()
30
- logger.info("Github MCP Server started successfully")
31
  except KeyboardInterrupt:
32
  logger.info("Shutting down server...")
33
  except Exception as e:
 
3
  from dotenv import load_dotenv
4
  from mcp.server.fastmcp import FastMCP
5
 
6
+ from pmcp.mcp_server.trello_server.tools.tools import register_tools
7
 
8
  # Configure logging
9
  logging.basicConfig(
 
27
  try:
28
  logger.info("Starting Trello MCP Server in Stdio...")
29
  mcp.run()
30
+ logger.info("Trello MCP Server started successfully")
31
  except KeyboardInterrupt:
32
  logger.info("Shutting down server...")
33
  except Exception as e:
pmcp/mcp_server/{trello → trello_server}/models.py RENAMED
File without changes
pmcp/mcp_server/{trello → trello_server}/services/__init__.py RENAMED
File without changes
pmcp/mcp_server/{trello → trello_server}/services/board.py RENAMED
@@ -4,8 +4,8 @@ Service for managing Trello boards in MCP server.
4
 
5
  from typing import List
6
 
7
- from pmcp.mcp_server.trello.models import TrelloBoard, TrelloLabel
8
- from pmcp.mcp_server.trello.utils.trello_api import TrelloClient
9
 
10
 
11
  class BoardService:
 
4
 
5
  from typing import List
6
 
7
+ from pmcp.mcp_server.trello_server.models import TrelloBoard, TrelloLabel
8
+ from pmcp.mcp_server.trello_server.utils.trello_api import TrelloClient
9
 
10
 
11
  class BoardService:
pmcp/mcp_server/{trello → trello_server}/services/card.py RENAMED
@@ -4,8 +4,8 @@ Service for managing Trello cards in MCP server.
4
 
5
  from typing import Any, Dict, List
6
 
7
- from pmcp.mcp_server.trello.models import TrelloCard
8
- from pmcp.mcp_server.trello.utils.trello_api import TrelloClient
9
 
10
 
11
  class CardService:
 
4
 
5
  from typing import Any, Dict, List
6
 
7
+ from pmcp.mcp_server.trello_server.models import TrelloCard
8
+ from pmcp.mcp_server.trello_server.utils.trello_api import TrelloClient
9
 
10
 
11
  class CardService:
pmcp/mcp_server/{trello → trello_server}/services/checklist.py RENAMED
@@ -1,7 +1,7 @@
1
  import logging
2
  from typing import Dict, List, Optional
3
 
4
- from pmcp.mcp_server.trello.utils.trello_api import TrelloClient
5
 
6
 
7
  class ChecklistService:
 
1
  import logging
2
  from typing import Dict, List, Optional
3
 
4
+ from pmcp.mcp_server.trello_server.utils.trello_api import TrelloClient
5
 
6
 
7
  class ChecklistService:
pmcp/mcp_server/{trello → trello_server}/services/list.py RENAMED
@@ -1,7 +1,7 @@
1
  from typing import List
2
 
3
- from pmcp.mcp_server.trello.models import TrelloList
4
- from pmcp.mcp_server.trello.utils.trello_api import TrelloClient
5
 
6
 
7
  class ListService:
 
1
  from typing import List
2
 
3
+ from pmcp.mcp_server.trello_server.models import TrelloList
4
+ from pmcp.mcp_server.trello_server.utils.trello_api import TrelloClient
5
 
6
 
7
  class ListService:
pmcp/mcp_server/{trello → trello_server}/tools/__init__.py RENAMED
File without changes
pmcp/mcp_server/{trello → trello_server}/tools/board.py RENAMED
@@ -7,9 +7,9 @@ from typing import List
7
 
8
  from mcp.server.fastmcp import Context
9
 
10
- from pmcp.mcp_server.trello.models import TrelloBoard, TrelloLabel
11
- from pmcp.mcp_server.trello.services.board import BoardService
12
- from pmcp.mcp_server.trello.trello import client
13
 
14
 
15
 
@@ -36,6 +36,7 @@ async def get_board(ctx: Context, board_id: str) -> TrelloBoard:
36
 
37
  async def get_boards(ctx: Context) -> List[TrelloBoard]:
38
  """Retrieves all boards for the authenticated user.
 
39
 
40
  Returns:
41
  List[TrelloBoard]: A list of board objects.
 
7
 
8
  from mcp.server.fastmcp import Context
9
 
10
+ from pmcp.mcp_server.trello_server.models import TrelloBoard, TrelloLabel
11
+ from pmcp.mcp_server.trello_server.services.board import BoardService
12
+ from pmcp.mcp_server.trello_server.trello import client
13
 
14
 
15
 
 
36
 
37
  async def get_boards(ctx: Context) -> List[TrelloBoard]:
38
  """Retrieves all boards for the authenticated user.
39
+ Use this method when the user specify only the Board Name and you have to retrieve the Board ID.
40
 
41
  Returns:
42
  List[TrelloBoard]: A list of board objects.
pmcp/mcp_server/{trello → trello_server}/tools/card.py RENAMED
@@ -7,10 +7,10 @@ from typing import List
7
 
8
  from mcp.server.fastmcp import Context
9
 
10
- from pmcp.mcp_server.trello.models import TrelloCard
11
- from pmcp.mcp_server.trello.services.card import CardService
12
- from pmcp.mcp_server.trello.trello import client
13
- from pmcp.mcp_server.trello.dtos.update_card import UpdateCardPayload
14
 
15
 
16
  service = CardService(client)
 
7
 
8
  from mcp.server.fastmcp import Context
9
 
10
+ from pmcp.mcp_server.trello_server.models import TrelloCard
11
+ from pmcp.mcp_server.trello_server.services.card import CardService
12
+ from pmcp.mcp_server.trello_server.trello import client
13
+ from pmcp.mcp_server.trello_server.dtos.update_card import UpdateCardPayload
14
 
15
 
16
  service = CardService(client)
pmcp/mcp_server/{trello → trello_server}/tools/checklist.py RENAMED
@@ -5,8 +5,8 @@ This module contains tools for managing Trello checklists.
5
  import logging
6
  from typing import Dict, List, Optional
7
 
8
- from pmcp.mcp_server.trello.services.checklist import ChecklistService
9
- from pmcp.mcp_server.trello.trello import client
10
 
11
  service = ChecklistService(client)
12
 
 
5
  import logging
6
  from typing import Dict, List, Optional
7
 
8
+ from pmcp.mcp_server.trello_server.services.checklist import ChecklistService
9
+ from pmcp.mcp_server.trello_server.trello import client
10
 
11
  service = ChecklistService(client)
12
 
pmcp/mcp_server/{trello → trello_server}/tools/list.py RENAMED
@@ -7,9 +7,9 @@ from typing import List
7
 
8
  from mcp.server.fastmcp import Context
9
 
10
- from pmcp.mcp_server.trello.models import TrelloList
11
- from pmcp.mcp_server.trello.services.list import ListService
12
- from pmcp.mcp_server.trello.trello import client
13
 
14
 
15
 
 
7
 
8
  from mcp.server.fastmcp import Context
9
 
10
+ from pmcp.mcp_server.trello_server.models import TrelloList
11
+ from pmcp.mcp_server.trello_server.services.list import ListService
12
+ from pmcp.mcp_server.trello_server.trello import client
13
 
14
 
15
 
pmcp/mcp_server/{trello → trello_server}/tools/tools.py RENAMED
@@ -2,7 +2,7 @@
2
  This module contains tools for managing Trello boards, lists, and cards.
3
  """
4
 
5
- from pmcp.mcp_server.trello.tools import board, card, checklist, list
6
 
7
 
8
  def register_tools(mcp):
 
2
  This module contains tools for managing Trello boards, lists, and cards.
3
  """
4
 
5
+ from pmcp.mcp_server.trello_server.tools import board, card, checklist, list
6
 
7
 
8
  def register_tools(mcp):
pmcp/mcp_server/{trello → trello_server}/trello.py RENAMED
@@ -3,7 +3,7 @@ import os
3
 
4
  from dotenv import load_dotenv
5
 
6
- from pmcp.mcp_server.trello.utils.trello_api import TrelloClient
7
 
8
 
9
  # Load environment variables
 
3
 
4
  from dotenv import load_dotenv
5
 
6
+ from pmcp.mcp_server.trello_server.utils.trello_api import TrelloClient
7
 
8
 
9
  # Load environment variables
pmcp/mcp_server/{trello → trello_server}/utils/__init__.py RENAMED
File without changes
pmcp/mcp_server/{trello → trello_server}/utils/trello_api.py RENAMED
File without changes
pyproject.toml CHANGED
@@ -15,6 +15,7 @@ dependencies = [
15
  "httpx>=0.28.1",
16
  "requests>=2.32.3",
17
  "grandalf>=0.8",
 
18
  ]
19
 
20
  [dependency-groups]
 
15
  "httpx>=0.28.1",
16
  "requests>=2.32.3",
17
  "grandalf>=0.8",
18
+ "fastmcp>=2.5.2",
19
  ]
20
 
21
  [dependency-groups]
uv.lock CHANGED
@@ -324,6 +324,18 @@ wheels = [
324
  { url = "https://files.pythonhosted.org/packages/bf/6c/e36d22e76f4aa4e1ea7ea9b443bd49b5ffd2f13d430840f47e35284f797a/duckduckgo_search-8.0.2-py3-none-any.whl", hash = "sha256:b5ff8b6b8f169b8e1b15a788a5749aa900ebcefd6e1ab485787582f8d5b4f1ef", size = 18184, upload-time = "2025-05-15T08:43:23.713Z" },
325
  ]
326
 
 
 
 
 
 
 
 
 
 
 
 
 
327
  [[package]]
328
  name = "fastapi"
329
  version = "0.115.12"
@@ -338,6 +350,25 @@ wheels = [
338
  { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload-time = "2025-03-23T22:55:42.101Z" },
339
  ]
340
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
341
  [[package]]
342
  name = "ffmpy"
343
  version = "0.5.0"
@@ -1172,6 +1203,18 @@ wheels = [
1172
  { url = "https://files.pythonhosted.org/packages/a8/d9/7ec61c010f0d0b0bc57dab8b8dff398f84230d269e8bfa068ad542ff050c/openai-1.82.1-py3-none-any.whl", hash = "sha256:334eb5006edf59aa464c9e932b9d137468d810b2659e5daea9b3a8c39d052395", size = 720466, upload-time = "2025-05-29T16:15:12.531Z" },
1173
  ]
1174
 
 
 
 
 
 
 
 
 
 
 
 
 
1175
  [[package]]
1176
  name = "orjson"
1177
  version = "3.10.18"
@@ -1332,6 +1375,7 @@ name = "pmcp"
1332
  version = "0.1.0"
1333
  source = { virtual = "." }
1334
  dependencies = [
 
1335
  { name = "gradio", extra = ["mcp"] },
1336
  { name = "grandalf" },
1337
  { name = "httpx" },
@@ -1352,6 +1396,7 @@ dev = [
1352
 
1353
  [package.metadata]
1354
  requires-dist = [
 
1355
  { name = "gradio", extras = ["mcp"], specifier = ">=5.32.0" },
1356
  { name = "grandalf", specifier = ">=0.8" },
1357
  { name = "httpx", specifier = ">=0.28.1" },
 
324
  { url = "https://files.pythonhosted.org/packages/bf/6c/e36d22e76f4aa4e1ea7ea9b443bd49b5ffd2f13d430840f47e35284f797a/duckduckgo_search-8.0.2-py3-none-any.whl", hash = "sha256:b5ff8b6b8f169b8e1b15a788a5749aa900ebcefd6e1ab485787582f8d5b4f1ef", size = 18184, upload-time = "2025-05-15T08:43:23.713Z" },
325
  ]
326
 
327
+ [[package]]
328
+ name = "exceptiongroup"
329
+ version = "1.3.0"
330
+ source = { registry = "https://pypi.org/simple" }
331
+ dependencies = [
332
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
333
+ ]
334
+ sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" }
335
+ wheels = [
336
+ { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" },
337
+ ]
338
+
339
  [[package]]
340
  name = "fastapi"
341
  version = "0.115.12"
 
350
  { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload-time = "2025-03-23T22:55:42.101Z" },
351
  ]
352
 
353
+ [[package]]
354
+ name = "fastmcp"
355
+ version = "2.5.2"
356
+ source = { registry = "https://pypi.org/simple" }
357
+ dependencies = [
358
+ { name = "exceptiongroup" },
359
+ { name = "httpx" },
360
+ { name = "mcp" },
361
+ { name = "openapi-pydantic" },
362
+ { name = "python-dotenv" },
363
+ { name = "rich" },
364
+ { name = "typer" },
365
+ { name = "websockets" },
366
+ ]
367
+ sdist = { url = "https://files.pythonhosted.org/packages/20/cc/d2c0e63d2b34681bef4e077611dae662ea722add13a83dc4ae08b6e0fd23/fastmcp-2.5.2.tar.gz", hash = "sha256:761c92fb54f561136f631d7d98b4920152978f6f0a66a4cef689a7983fd05c8b", size = 1039189, upload-time = "2025-05-29T18:11:33.088Z" }
368
+ wheels = [
369
+ { url = "https://files.pythonhosted.org/packages/3e/ac/caa94ff747e2136829ac2fea33b9583e086ca5431451751bcb2f773e087f/fastmcp-2.5.2-py3-none-any.whl", hash = "sha256:4ea46ef35c1308b369eff7c8a10e4c9639bed046fd646449c1227ac7c3856d83", size = 107502, upload-time = "2025-05-29T18:11:31.577Z" },
370
+ ]
371
+
372
  [[package]]
373
  name = "ffmpy"
374
  version = "0.5.0"
 
1203
  { url = "https://files.pythonhosted.org/packages/a8/d9/7ec61c010f0d0b0bc57dab8b8dff398f84230d269e8bfa068ad542ff050c/openai-1.82.1-py3-none-any.whl", hash = "sha256:334eb5006edf59aa464c9e932b9d137468d810b2659e5daea9b3a8c39d052395", size = 720466, upload-time = "2025-05-29T16:15:12.531Z" },
1204
  ]
1205
 
1206
+ [[package]]
1207
+ name = "openapi-pydantic"
1208
+ version = "0.5.1"
1209
+ source = { registry = "https://pypi.org/simple" }
1210
+ dependencies = [
1211
+ { name = "pydantic" },
1212
+ ]
1213
+ sdist = { url = "https://files.pythonhosted.org/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", size = 60892, upload-time = "2025-01-08T19:29:27.083Z" }
1214
+ wheels = [
1215
+ { url = "https://files.pythonhosted.org/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381, upload-time = "2025-01-08T19:29:25.275Z" },
1216
+ ]
1217
+
1218
  [[package]]
1219
  name = "orjson"
1220
  version = "3.10.18"
 
1375
  version = "0.1.0"
1376
  source = { virtual = "." }
1377
  dependencies = [
1378
+ { name = "fastmcp" },
1379
  { name = "gradio", extra = ["mcp"] },
1380
  { name = "grandalf" },
1381
  { name = "httpx" },
 
1396
 
1397
  [package.metadata]
1398
  requires-dist = [
1399
+ { name = "fastmcp", specifier = ">=2.5.2" },
1400
  { name = "gradio", extras = ["mcp"], specifier = ">=5.32.0" },
1401
  { name = "grandalf", specifier = ">=0.8" },
1402
  { name = "httpx", specifier = ">=0.28.1" },