├── Dockerfile ├── LICENSE ├── README.md ├── deploy.sh ├── publish.sh ├── pyproject.toml ├── registry.json ├── smithery.yaml ├── src └── github_chat_mcp │ ├── __init__.py │ ├── __pycache__ │ ├── server.cpython-310.pyc │ ├── server.cpython-311.pyc │ └── server.cpython-312.pyc │ └── server.py └── uv.lock /Dockerfile: -------------------------------------------------------------------------------- 1 | # Generated by https://smithery.ai. See: https://smithery.ai/docs/config#dockerfile 2 | # Use a Python image with uv pre-installed 3 | FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS uv 4 | 5 | # Install the project into /app 6 | WORKDIR /app 7 | 8 | # Enable bytecode compilation 9 | ENV UV_COMPILE_BYTECODE=1 10 | 11 | # Copy the lock file and pyproject.toml for dependency management 12 | COPY uv.lock pyproject.toml /app/ 13 | 14 | # Install the project's dependencies using the lockfile and settings 15 | RUN --mount=type=cache,target=/root/.cache/uv \ 16 | uv sync --frozen --no-install-project --no-dev --no-editable 17 | 18 | # Then, add the rest of the project source code and install it 19 | ADD . /app 20 | RUN --mount=type=cache,target=/root/.cache/uv \ 21 | uv sync --frozen --no-dev --no-editable 22 | 23 | # Create the final image 24 | FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim 25 | 26 | WORKDIR /app 27 | 28 | # Copy the virtual environment directly 29 | COPY --from=uv --chown=app:app /app/.venv /app/.venv 30 | 31 | # Create app user 32 | RUN useradd -m app 33 | 34 | # Place executables in the environment at the front of the path 35 | ENV PATH="/app/.venv/bin:$PATH" 36 | 37 | # Environment variable for the GitHub API key 38 | ENV GITHUB_API_KEY=YOUR_API_KEY_HERE 39 | 40 | # Switch to non-root user 41 | USER app 42 | 43 | # Run the MCP server 44 | ENTRYPOINT ["github-chat-mcp"] 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Kagi Search 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GitHub Chat MCP 2 | 3 | A Model Context Protocol (MCP) for analyzing and querying GitHub repositories using the GitHub Chat API. Official Site: https://github-chat.com 4 | 5 | ## Installation 6 | 7 | ```bash 8 | # Install with pip 9 | pip install github-chat-mcp 10 | 11 | # Or install with the newer uv package manager 12 | uv install github-chat-mcp 13 | ``` 14 | 15 | 16 | 17 | 3. Start using it with Claude! 18 | 19 | Example prompts: 20 | - "Use github-chat-mcp to analyze the React repository" 21 | - "Index the TypeScript repository with github-chat-mcp and ask about its architecture" 22 | 23 | # GitHub Chat MCP server 24 | 25 | [![smithery badge](https://smithery.ai/badge/github-chat-mcp)](https://smithery.ai/server/github-chat-mcp) 26 | 27 | ## Setup Instructions 28 | > Before anything, ensure you have a GitHub Chat API key. This is required to use the service. 29 | 30 | Install uv first. 31 | 32 | MacOS/Linux: 33 | ```bash 34 | curl -LsSf https://astral.sh/uv/install.sh | sh 35 | ``` 36 | 37 | Windows: 38 | ``` 39 | powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 40 | ``` 41 | 42 | ### Setup with Cursor (Recommended) 43 | In mcp.json: 44 | 45 | ```json 46 | { 47 | "mcpServers": { 48 | "github-chat": { 49 | "command": "uvx", 50 | "args": [ 51 | "github-chat-mcp" 52 | ] 53 | } 54 | } 55 | } 56 | ``` 57 | 58 | With above, no envs required since it's a freemium release. 59 | 60 | ### Setup with Claude Desktop 61 | ```json 62 | # claude_desktop_config.json 63 | # Can find location through: 64 | # Hamburger Menu -> File -> Settings -> Developer -> Edit Config 65 | # Must perform: brew install uv 66 | { 67 | "mcpServers": { 68 | "github-chat": { 69 | "command": "uvx", 70 | "args": ["github-chat-mcp"], 71 | "env": { 72 | } 73 | } 74 | } 75 | } 76 | ``` 77 | 78 | ### Installing via Smithery 79 | 80 | You can install GitHub Chat for Claude Desktop automatically via Smithery: 81 | 82 | ```bash 83 | npx -y @smithery/cli install github-chat-mcp --client claude 84 | ``` 85 | 86 | ### Using GitHub Chat with Claude 87 | 1. Index a GitHub repository first: 88 | "Index the GitHub repository at https://github.com/username/repo" 89 | 90 | 2. Then ask questions about the repository: 91 | "What is the core tech stack used in this repository?" 92 | 93 | ### Debugging 94 | Run: 95 | ```bash 96 | npx @modelcontextprotocol/inspector uvx github-chat-mcp 97 | ``` 98 | 99 | ## Local/Dev Setup Instructions 100 | 101 | ### Clone repo 102 | `git clone https://github.com/yourusername/github-chat-mcp.git` 103 | 104 | ### Install dependencies 105 | Install uv first. 106 | 107 | MacOS/Linux: 108 | ```bash 109 | curl -LsSf https://astral.sh/uv/install.sh | sh 110 | ``` 111 | 112 | Windows: 113 | ``` 114 | powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 115 | ``` 116 | 117 | Then install MCP server dependencies: 118 | ```bash 119 | cd github-chat-mcp 120 | 121 | # Create virtual environment and activate it 122 | uv venv 123 | 124 | source .venv/bin/activate # MacOS/Linux 125 | # OR 126 | .venv/Scripts/activate # Windows 127 | 128 | # Install dependencies 129 | uv sync 130 | ``` 131 | ### Setup with Claude Desktop 132 | 133 | #### Using MCP CLI SDK 134 | ```bash 135 | # `pip install mcp[cli]` if you haven't 136 | mcp install /ABSOLUTE/PATH/TO/PARENT/FOLDER/github-chat-mcp/src/github_chat_mcp/server.py -v "GITHUB_API_KEY=API_KEY_HERE" 137 | ``` 138 | 139 | #### Manually 140 | ```json 141 | # claude_desktop_config.json 142 | # Can find location through: 143 | # Hamburger Menu -> File -> Settings -> Developer -> Edit Config 144 | { 145 | "mcpServers": { 146 | "github-chat": { 147 | "command": "uv", 148 | "args": [ 149 | "--directory", 150 | "/ABSOLUTE/PATH/TO/PARENT/FOLDER/github-chat-mcp", 151 | "run", 152 | "github-chat-mcp" 153 | ], 154 | "env": { 155 | } 156 | } 157 | } 158 | } 159 | ``` 160 | 161 | ### Using GitHub Chat with Claude 162 | 1. Index a GitHub repository first: 163 | "Index the GitHub repository at https://github.com/username/repo" 164 | 165 | 2. Then ask questions about the repository: 166 | "What is the core tech stack used in this repository?" 167 | 168 | ### Debugging 169 | Run: 170 | ```bash 171 | # If mcp cli installed (`pip install mcp[cli]`) 172 | mcp dev /ABSOLUTE/PATH/TO/PARENT/FOLDER/github-chat-mcp/src/github_chat_mcp/server.py 173 | 174 | # If not 175 | npx @modelcontextprotocol/inspector \ 176 | uv \ 177 | --directory /ABSOLUTE/PATH/TO/PARENT/FOLDER/github-chat-mcp \ 178 | run \ 179 | github-chat-mcp 180 | ``` 181 | Then access MCP Inspector at `http://localhost:5173`. You may need to add your GitHub API key in the environment variables in the inspector under `GITHUB_API_KEY`. 182 | 183 | # Notes 184 | - Level of logging is adjustable through the `FASTMCP_LOG_LEVEL` environment variable (e.g. `FASTMCP_LOG_LEVEL="ERROR"`) 185 | - This MCP server provides two main tools: 186 | 1. Repository Indexing - Index and analyze a GitHub repository 187 | 2. Repository Querying - Ask questions about the indexed repository -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | # Build the Docker image 5 | docker build -t github-chat-mcp . 6 | 7 | # Optional: Push to a container registry like Docker Hub or GitHub Container Registry 8 | # docker tag github-chat-mcp yourusername/github-chat-mcp:latest 9 | # docker push yourusername/github-chat-mcp:latest 10 | 11 | # Run locally for testing 12 | echo "Starting GitHub Chat MCP server locally for testing..." 13 | docker run -e GITHUB_API_KEY=$GITHUB_API_KEY -p 8000:8000 github-chat-mcp 14 | 15 | # Instructions for deploying to production environments 16 | cat << EOF 17 | 18 | ------------------------------------ 19 | Production Deployment Instructions: 20 | ------------------------------------ 21 | 22 | 1. Push the Docker image to a container registry: 23 | docker tag github-chat-mcp yourusername/github-chat-mcp:latest 24 | docker push yourusername/github-chat-mcp:latest 25 | 26 | 2. Deploy to your preferred hosting service: 27 | 28 | - For AWS ECS: 29 | aws ecs create-service --service-name github-chat-mcp --task-definition github-chat-mcp --desired-count 1 30 | 31 | - For Kubernetes: 32 | kubectl apply -f kubernetes-deployment.yaml 33 | 34 | - For Google Cloud Run: 35 | gcloud run deploy github-chat-mcp --image yourusername/github-chat-mcp:latest --platform managed 36 | 37 | 3. Configure the environment variable GITHUB_API_KEY in your production environment. 38 | 39 | 4. Register your MCP with the MCP registry by following the MCP documentation. 40 | 41 | EOF -------------------------------------------------------------------------------- /publish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | # Clean up any previous builds 5 | rm -rf dist/ 6 | 7 | # Build the package 8 | python -m pip install --upgrade build 9 | python -m build 10 | 11 | # Upload to PyPI 12 | python -m pip install --upgrade twine 13 | python -m twine upload dist/* 14 | 15 | echo "Package published to PyPI successfully!" -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "github-chat-mcp" 3 | version = "0.1.0" 4 | authors = [ 5 | {name="Sheing Ng", email="sng@asyncfunc.ai"}, 6 | ] 7 | description = "GitHub Chat MCP server for analyzing GitHub repositories" 8 | readme = "README.md" 9 | requires-python = ">=3.12" 10 | dependencies = [ 11 | "requests~=2.31.0", 12 | "mcp[cli]~=1.6.0", 13 | "pydantic~=2.10.3", 14 | ] 15 | 16 | [project.urls] 17 | Homepage = "https://github.com/AsyncFuncAI/github-chat-mcp" 18 | Issues = "https://github.com/AsyncFuncAI/github-chat-mcp/issues" 19 | 20 | [build-system] 21 | requires = ["hatchling"] 22 | build-backend = "hatchling.build" 23 | 24 | [project.scripts] 25 | github-chat-mcp = "github_chat_mcp:main" 26 | -------------------------------------------------------------------------------- /registry.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "github-chat-mcp", 3 | "description": "GitHub Chat MCP server for analyzing and querying GitHub repositories", 4 | "version": "0.1.0", 5 | "repositoryUrl": "https://github.com/yourusername/github-chat-mcp", 6 | "installCommand": "pip install github-chat-mcp", 7 | "tools": [ 8 | { 9 | "name": "index_repository", 10 | "description": "Index a GitHub repository to analyze its codebase. This must be done before asking questions about the repository." 11 | }, 12 | { 13 | "name": "query_repository", 14 | "description": "Ask questions about a GitHub repository and receive detailed AI responses. The repository must be indexed first." 15 | } 16 | ], 17 | "configuration": { 18 | "githubApiKey": { 19 | "type": "string", 20 | "description": "API key for GitHub Chat API", 21 | "required": true 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /smithery.yaml: -------------------------------------------------------------------------------- 1 | # Smithery configuration file: https://smithery.ai/docs/config#smitheryyaml 2 | 3 | startCommand: 4 | type: stdio 5 | configSchema: 6 | # JSON Schema defining the configuration options for the MCP. 7 | type: object 8 | required: 9 | - githubApiKey 10 | properties: 11 | githubApiKey: 12 | type: string 13 | description: The API key for the GitHub Chat MCP server. 14 | commandFunction: 15 | # A function that produces the CLI command to start the MCP on stdio. 16 | |- 17 | (config) => ({command:'uv',args:['run','github-chat-mcp'],env:{GITHUB_API_KEY:config.githubApiKey}}) 18 | -------------------------------------------------------------------------------- /src/github_chat_mcp/__init__.py: -------------------------------------------------------------------------------- 1 | from . import server 2 | 3 | 4 | def main(): 5 | """Main entry point for the package.""" 6 | server.main() 7 | 8 | 9 | # Optionally expose other important items at package level 10 | __all__ = ["main", "server"] -------------------------------------------------------------------------------- /src/github_chat_mcp/__pycache__/server.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AsyncFuncAI/github-chat-mcp/8c1a390f10ab295ea7ce61c32461bbee06d2c654/src/github_chat_mcp/__pycache__/server.cpython-310.pyc -------------------------------------------------------------------------------- /src/github_chat_mcp/__pycache__/server.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AsyncFuncAI/github-chat-mcp/8c1a390f10ab295ea7ce61c32461bbee06d2c654/src/github_chat_mcp/__pycache__/server.cpython-311.pyc -------------------------------------------------------------------------------- /src/github_chat_mcp/__pycache__/server.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AsyncFuncAI/github-chat-mcp/8c1a390f10ab295ea7ce61c32461bbee06d2c654/src/github_chat_mcp/__pycache__/server.cpython-312.pyc -------------------------------------------------------------------------------- /src/github_chat_mcp/server.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import requests 4 | from typing import List, Dict, Any, Optional 5 | 6 | from mcp.server.fastmcp import FastMCP 7 | from pydantic import Field 8 | 9 | 10 | GITHUB_CHAT_API_BASE = "https://api.github-chat.com" 11 | API_KEY = os.environ.get("GITHUB_API_KEY", "") 12 | 13 | mcp = FastMCP("github-chat-mcp", dependencies=["requests", "mcp[cli]"]) 14 | 15 | 16 | @mcp.tool() 17 | def index_repository( 18 | repo_url: str = Field( 19 | description="The GitHub repository URL to index (format: https://github.com/username/repo)." 20 | ), 21 | ) -> str: 22 | """Index a GitHub repository to analyze its codebase. This must be done before asking questions about the repository.""" 23 | try: 24 | if not repo_url: 25 | raise ValueError("Repository URL cannot be empty.") 26 | 27 | if not repo_url.startswith("https://github.com/"): 28 | raise ValueError("Repository URL must be in the format: https://github.com/username/repo") 29 | 30 | # Call the verify API endpoint 31 | response = requests.post( 32 | f"{GITHUB_CHAT_API_BASE}/verify", 33 | headers={"Content-Type": "application/json"}, 34 | json={"repo_url": repo_url} 35 | ) 36 | 37 | if response.status_code != 200: 38 | return f"Error indexing repository: {response.text}" 39 | 40 | return f"Successfully indexed repository: {repo_url}. You can now ask questions about this repository." 41 | 42 | except Exception as e: 43 | return f"Error: {str(e) or repr(e)}" 44 | 45 | 46 | @mcp.tool() 47 | def query_repository( 48 | repo_url: str = Field( 49 | description="The GitHub repository URL to query (format: https://github.com/username/repo)." 50 | ), 51 | question: str = Field( 52 | description="The question to ask about the repository." 53 | ), 54 | conversation_history: Optional[List[Dict[str, str]]] = Field( 55 | description="Previous conversation history for multi-turn conversations.", default=None 56 | ), 57 | ) -> str: 58 | """Ask questions about a GitHub repository and receive detailed AI responses. The repository must be indexed first.""" 59 | try: 60 | if not repo_url or not question: 61 | raise ValueError("Repository URL and question cannot be empty.") 62 | 63 | if not repo_url.startswith("https://github.com/"): 64 | raise ValueError("Repository URL must be in the format: https://github.com/username/repo") 65 | 66 | # Prepare messages array 67 | messages = conversation_history or [] 68 | messages.append({"role": "user", "content": question}) 69 | 70 | # Call the chat completions API endpoint 71 | response = requests.post( 72 | f"{GITHUB_CHAT_API_BASE}/chat/completions/sync", 73 | headers={"Content-Type": "application/json"}, 74 | json={ 75 | "repo_url": repo_url, 76 | "messages": messages 77 | } 78 | ) 79 | 80 | if response.status_code != 200: 81 | return f"Error querying repository: {response.text}" 82 | 83 | # Format the response 84 | result = response.json() 85 | formatted_response = format_chat_response(result) 86 | 87 | return formatted_response 88 | 89 | except Exception as e: 90 | return f"Error: {str(e) or repr(e)}" 91 | 92 | 93 | def format_chat_response(response: Dict[str, Any]) -> str: 94 | """Format the chat response in a readable way.""" 95 | formatted = "" 96 | 97 | if "answer" in response: 98 | formatted += response["answer"] + "\n\n" 99 | 100 | if "contexts" in response and response["contexts"]: 101 | formatted += "Sources:\n" 102 | for i, context in enumerate(response["contexts"], 1): 103 | if "meta_data" in context and "file_path" in context["meta_data"]: 104 | formatted += f"{i}. {context['meta_data']['file_path']}\n" 105 | 106 | return formatted.strip() 107 | 108 | 109 | def main(): 110 | mcp.run() 111 | 112 | 113 | if __name__ == "__main__": 114 | main() -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | requires-python = ">=3.12" 3 | 4 | [[package]] 5 | name = "annotated-types" 6 | version = "0.7.0" 7 | source = { registry = "https://pypi.org/simple" } 8 | sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } 9 | wheels = [ 10 | { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, 11 | ] 12 | 13 | [[package]] 14 | name = "anyio" 15 | version = "4.8.0" 16 | source = { registry = "https://pypi.org/simple" } 17 | dependencies = [ 18 | { name = "idna" }, 19 | { name = "sniffio" }, 20 | { name = "typing-extensions", marker = "python_full_version < '3.13'" }, 21 | ] 22 | sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } 23 | wheels = [ 24 | { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, 25 | ] 26 | 27 | [[package]] 28 | name = "certifi" 29 | version = "2024.12.14" 30 | source = { registry = "https://pypi.org/simple" } 31 | sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } 32 | wheels = [ 33 | { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, 34 | ] 35 | 36 | [[package]] 37 | name = "charset-normalizer" 38 | version = "3.4.1" 39 | source = { registry = "https://pypi.org/simple" } 40 | sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } 41 | wheels = [ 42 | { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, 43 | { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, 44 | { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, 45 | { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, 46 | { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, 47 | { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, 48 | { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, 49 | { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, 50 | { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, 51 | { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, 52 | { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, 53 | { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, 54 | { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, 55 | { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, 56 | { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, 57 | { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, 58 | { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, 59 | { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, 60 | { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, 61 | { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, 62 | { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, 63 | { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, 64 | { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, 65 | { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, 66 | { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, 67 | { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, 68 | { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, 69 | ] 70 | 71 | [[package]] 72 | name = "click" 73 | version = "8.1.8" 74 | source = { registry = "https://pypi.org/simple" } 75 | dependencies = [ 76 | { name = "colorama", marker = "platform_system == 'Windows'" }, 77 | ] 78 | sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } 79 | wheels = [ 80 | { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, 81 | ] 82 | 83 | [[package]] 84 | name = "colorama" 85 | version = "0.4.6" 86 | source = { registry = "https://pypi.org/simple" } 87 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } 88 | wheels = [ 89 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, 90 | ] 91 | 92 | [[package]] 93 | name = "github-chat-mcp" 94 | version = "0.1.0" 95 | source = { editable = "." } 96 | dependencies = [ 97 | { name = "mcp", extra = ["cli"] }, 98 | { name = "pydantic" }, 99 | { name = "requests" }, 100 | ] 101 | 102 | [package.metadata] 103 | requires-dist = [ 104 | { name = "mcp", extras = ["cli"], specifier = "~=1.6.0" }, 105 | { name = "pydantic", specifier = "~=2.10.3" }, 106 | { name = "requests", specifier = "~=2.31.0" }, 107 | ] 108 | 109 | [[package]] 110 | name = "h11" 111 | version = "0.14.0" 112 | source = { registry = "https://pypi.org/simple" } 113 | sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } 114 | wheels = [ 115 | { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, 116 | ] 117 | 118 | [[package]] 119 | name = "httpcore" 120 | version = "1.0.7" 121 | source = { registry = "https://pypi.org/simple" } 122 | dependencies = [ 123 | { name = "certifi" }, 124 | { name = "h11" }, 125 | ] 126 | sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } 127 | wheels = [ 128 | { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, 129 | ] 130 | 131 | [[package]] 132 | name = "httpx" 133 | version = "0.28.1" 134 | source = { registry = "https://pypi.org/simple" } 135 | dependencies = [ 136 | { name = "anyio" }, 137 | { name = "certifi" }, 138 | { name = "httpcore" }, 139 | { name = "idna" }, 140 | ] 141 | sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } 142 | wheels = [ 143 | { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, 144 | ] 145 | 146 | [[package]] 147 | name = "httpx-sse" 148 | version = "0.4.0" 149 | source = { registry = "https://pypi.org/simple" } 150 | sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 } 151 | wheels = [ 152 | { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 }, 153 | ] 154 | 155 | [[package]] 156 | name = "idna" 157 | version = "3.10" 158 | source = { registry = "https://pypi.org/simple" } 159 | sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } 160 | wheels = [ 161 | { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, 162 | ] 163 | 164 | [[package]] 165 | name = "markdown-it-py" 166 | version = "3.0.0" 167 | source = { registry = "https://pypi.org/simple" } 168 | dependencies = [ 169 | { name = "mdurl" }, 170 | ] 171 | sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } 172 | wheels = [ 173 | { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, 174 | ] 175 | 176 | [[package]] 177 | name = "mcp" 178 | version = "1.6.0" 179 | source = { registry = "https://pypi.org/simple" } 180 | dependencies = [ 181 | { name = "anyio" }, 182 | { name = "httpx" }, 183 | { name = "httpx-sse" }, 184 | { name = "pydantic" }, 185 | { name = "pydantic-settings" }, 186 | { name = "sse-starlette" }, 187 | { name = "starlette" }, 188 | { name = "uvicorn" }, 189 | ] 190 | sdist = { url = "https://files.pythonhosted.org/packages/95/d2/f587cb965a56e992634bebc8611c5b579af912b74e04eb9164bd49527d21/mcp-1.6.0.tar.gz", hash = "sha256:d9324876de2c5637369f43161cd71eebfd803df5a95e46225cab8d280e366723", size = 200031 } 191 | wheels = [ 192 | { url = "https://files.pythonhosted.org/packages/10/30/20a7f33b0b884a9d14dd3aa94ff1ac9da1479fe2ad66dd9e2736075d2506/mcp-1.6.0-py3-none-any.whl", hash = "sha256:7bd24c6ea042dbec44c754f100984d186620d8b841ec30f1b19eda9b93a634d0", size = 76077 }, 193 | ] 194 | 195 | [package.optional-dependencies] 196 | cli = [ 197 | { name = "python-dotenv" }, 198 | { name = "typer" }, 199 | ] 200 | 201 | [[package]] 202 | name = "mdurl" 203 | version = "0.1.2" 204 | source = { registry = "https://pypi.org/simple" } 205 | sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } 206 | wheels = [ 207 | { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, 208 | ] 209 | 210 | [[package]] 211 | name = "pydantic" 212 | version = "2.10.5" 213 | source = { registry = "https://pypi.org/simple" } 214 | dependencies = [ 215 | { name = "annotated-types" }, 216 | { name = "pydantic-core" }, 217 | { name = "typing-extensions" }, 218 | ] 219 | sdist = { url = "https://files.pythonhosted.org/packages/6a/c7/ca334c2ef6f2e046b1144fe4bb2a5da8a4c574e7f2ebf7e16b34a6a2fa92/pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff", size = 761287 } 220 | wheels = [ 221 | { url = "https://files.pythonhosted.org/packages/58/26/82663c79010b28eddf29dcdd0ea723439535fa917fce5905885c0e9ba562/pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53", size = 431426 }, 222 | ] 223 | 224 | [[package]] 225 | name = "pydantic-core" 226 | version = "2.27.2" 227 | source = { registry = "https://pypi.org/simple" } 228 | dependencies = [ 229 | { name = "typing-extensions" }, 230 | ] 231 | sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } 232 | wheels = [ 233 | { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, 234 | { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, 235 | { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, 236 | { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, 237 | { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, 238 | { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, 239 | { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, 240 | { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, 241 | { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, 242 | { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, 243 | { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, 244 | { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, 245 | { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, 246 | { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, 247 | { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, 248 | { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, 249 | { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, 250 | { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, 251 | { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, 252 | { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, 253 | { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, 254 | { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, 255 | { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, 256 | { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, 257 | { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, 258 | { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, 259 | { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, 260 | { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, 261 | ] 262 | 263 | [[package]] 264 | name = "pydantic-settings" 265 | version = "2.7.1" 266 | source = { registry = "https://pypi.org/simple" } 267 | dependencies = [ 268 | { name = "pydantic" }, 269 | { name = "python-dotenv" }, 270 | ] 271 | sdist = { url = "https://files.pythonhosted.org/packages/73/7b/c58a586cd7d9ac66d2ee4ba60ca2d241fa837c02bca9bea80a9a8c3d22a9/pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93", size = 79920 } 272 | wheels = [ 273 | { url = "https://files.pythonhosted.org/packages/b4/46/93416fdae86d40879714f72956ac14df9c7b76f7d41a4d68aa9f71a0028b/pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd", size = 29718 }, 274 | ] 275 | 276 | [[package]] 277 | name = "pygments" 278 | version = "2.19.1" 279 | source = { registry = "https://pypi.org/simple" } 280 | sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } 281 | wheels = [ 282 | { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, 283 | ] 284 | 285 | [[package]] 286 | name = "python-dotenv" 287 | version = "1.0.1" 288 | source = { registry = "https://pypi.org/simple" } 289 | sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } 290 | wheels = [ 291 | { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, 292 | ] 293 | 294 | [[package]] 295 | name = "requests" 296 | version = "2.31.0" 297 | source = { registry = "https://pypi.org/simple" } 298 | dependencies = [ 299 | { name = "certifi" }, 300 | { name = "charset-normalizer" }, 301 | { name = "idna" }, 302 | { name = "urllib3" }, 303 | ] 304 | sdist = { url = "https://files.pythonhosted.org/packages/9d/be/10918a2eac4ae9f02f6cfe6414b7a155ccd8f7f9d4380d62fd5b955065c3/requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1", size = 110794 } 305 | wheels = [ 306 | { url = "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", size = 62574 }, 307 | ] 308 | 309 | [[package]] 310 | name = "rich" 311 | version = "13.9.4" 312 | source = { registry = "https://pypi.org/simple" } 313 | dependencies = [ 314 | { name = "markdown-it-py" }, 315 | { name = "pygments" }, 316 | ] 317 | sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } 318 | wheels = [ 319 | { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, 320 | ] 321 | 322 | [[package]] 323 | name = "shellingham" 324 | version = "1.5.4" 325 | source = { registry = "https://pypi.org/simple" } 326 | sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } 327 | wheels = [ 328 | { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, 329 | ] 330 | 331 | [[package]] 332 | name = "sniffio" 333 | version = "1.3.1" 334 | source = { registry = "https://pypi.org/simple" } 335 | sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } 336 | wheels = [ 337 | { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, 338 | ] 339 | 340 | [[package]] 341 | name = "sse-starlette" 342 | version = "2.2.1" 343 | source = { registry = "https://pypi.org/simple" } 344 | dependencies = [ 345 | { name = "anyio" }, 346 | { name = "starlette" }, 347 | ] 348 | sdist = { url = "https://files.pythonhosted.org/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376 } 349 | wheels = [ 350 | { url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl", hash = "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99", size = 10120 }, 351 | ] 352 | 353 | [[package]] 354 | name = "starlette" 355 | version = "0.45.2" 356 | source = { registry = "https://pypi.org/simple" } 357 | dependencies = [ 358 | { name = "anyio" }, 359 | ] 360 | sdist = { url = "https://files.pythonhosted.org/packages/90/4f/e1c9f4ec3dae67a94c9285ed275355d5f7cf0f3a5c34538c8ae5412af550/starlette-0.45.2.tar.gz", hash = "sha256:bba1831d15ae5212b22feab2f218bab6ed3cd0fc2dc1d4442443bb1ee52260e0", size = 2574026 } 361 | wheels = [ 362 | { url = "https://files.pythonhosted.org/packages/aa/ab/fe4f57c83620b39dfc9e7687ebad59129ff05170b99422105019d9a65eec/starlette-0.45.2-py3-none-any.whl", hash = "sha256:4daec3356fb0cb1e723a5235e5beaf375d2259af27532958e2d79df549dad9da", size = 71505 }, 363 | ] 364 | 365 | [[package]] 366 | name = "typer" 367 | version = "0.15.1" 368 | source = { registry = "https://pypi.org/simple" } 369 | dependencies = [ 370 | { name = "click" }, 371 | { name = "rich" }, 372 | { name = "shellingham" }, 373 | { name = "typing-extensions" }, 374 | ] 375 | sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/dca7b219718afd37a0068f4f2530a727c2b74a8b6e8e0c0080a4c0de4fcd/typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a", size = 99789 } 376 | wheels = [ 377 | { url = "https://files.pythonhosted.org/packages/d0/cc/0a838ba5ca64dc832aa43f727bd586309846b0ffb2ce52422543e6075e8a/typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847", size = 44908 }, 378 | ] 379 | 380 | [[package]] 381 | name = "typing-extensions" 382 | version = "4.12.2" 383 | source = { registry = "https://pypi.org/simple" } 384 | sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } 385 | wheels = [ 386 | { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, 387 | ] 388 | 389 | [[package]] 390 | name = "urllib3" 391 | version = "2.3.0" 392 | source = { registry = "https://pypi.org/simple" } 393 | sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } 394 | wheels = [ 395 | { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, 396 | ] 397 | 398 | [[package]] 399 | name = "uvicorn" 400 | version = "0.34.0" 401 | source = { registry = "https://pypi.org/simple" } 402 | dependencies = [ 403 | { name = "click" }, 404 | { name = "h11" }, 405 | ] 406 | sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } 407 | wheels = [ 408 | { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, 409 | ] 410 | --------------------------------------------------------------------------------