github-mcp-agent 0.1.0__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/.gitignore +2 -0
  2. github_mcp_agent-0.2.1/LICENSE +21 -0
  3. github_mcp_agent-0.2.1/PKG-INFO +147 -0
  4. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/README.md +11 -5
  5. github_mcp_agent-0.2.1/assets/demo1.png +0 -0
  6. github_mcp_agent-0.2.1/assets/demo2.png +0 -0
  7. github_mcp_agent-0.2.1/assets/demo3.png +0 -0
  8. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/providers/__init__.py +0 -1
  9. github_mcp_agent-0.2.1/github_mcp_agent/providers/copilot.py +117 -0
  10. github_mcp_agent-0.2.1/pyproject.toml +50 -0
  11. github_mcp_agent-0.1.0/PKG-INFO +0 -14
  12. github_mcp_agent-0.1.0/github_mcp_agent/providers/copilot.py +0 -32
  13. github_mcp_agent-0.1.0/pyproject.toml +0 -29
  14. github_mcp_agent-0.1.0/uv.lock +0 -2693
  15. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/.claude/settings.json +0 -0
  16. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/.claude/settings.local.json +0 -0
  17. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/.env.example +0 -0
  18. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/__init__.py +0 -0
  19. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/agent.py +0 -0
  20. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/cli.py +0 -0
  21. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/providers/anthropic.py +0 -0
  22. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/providers/bedrock.py +0 -0
  23. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/providers/gemini.py +0 -0
  24. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/providers/ollama.py +0 -0
  25. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/providers/openai.py +0 -0
  26. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/setup_wizard.py +0 -0
  27. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/system_prompt.txt +0 -0
  28. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/github_mcp_agent/tools.py +0 -0
  29. {github_mcp_agent-0.1.0 → github_mcp_agent-0.2.1}/system_prompt.txt +0 -0
@@ -2,3 +2,5 @@
2
2
  .venv/
3
3
  __pycache__/
4
4
  *.pyc
5
+ uv.lock
6
+ dist/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Omar Hany
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.
@@ -0,0 +1,147 @@
1
+ Metadata-Version: 2.4
2
+ Name: github-mcp-agent
3
+ Version: 0.2.1
4
+ Summary: Talk to your GitHub repos, issues, and project boards in plain English from your terminal
5
+ Project-URL: Homepage, https://github.com/OmarCodes022/GitHub-MCP-Agent
6
+ Project-URL: Repository, https://github.com/OmarCodes022/GitHub-MCP-Agent
7
+ Project-URL: Issues, https://github.com/OmarCodes022/GitHub-MCP-Agent/issues
8
+ Author-email: Omar Hany <omarhanyabbas2004@gmail.com>
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: agent,ai,cli,copilot,github,mcp
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Software Development
21
+ Classifier: Topic :: Utilities
22
+ Requires-Python: >=3.10
23
+ Requires-Dist: anthropic
24
+ Requires-Dist: boto3
25
+ Requires-Dist: click
26
+ Requires-Dist: litellm
27
+ Requires-Dist: mcp
28
+ Requires-Dist: python-dotenv
29
+ Requires-Dist: questionary
30
+ Requires-Dist: rich
31
+ Requires-Dist: strands-agents
32
+ Description-Content-Type: text/markdown
33
+
34
+ # GitHub MCP Agent
35
+
36
+ Talk to your GitHub repos, issues, and project boards in plain English from your terminal.
37
+
38
+ ![GitHub MCP Agent demo](assets/demo1.png)
39
+
40
+ ```
41
+ You > list open issues in my raytracer repo
42
+ You > set priority of issue #42 to urgent
43
+ You > what's in progress on the project board?
44
+ You > which issues are assigned to maryam?
45
+ ```
46
+
47
+ ---
48
+
49
+ ## Install
50
+
51
+ ```bash
52
+ pip install github-mcp-agent
53
+ ```
54
+
55
+ Or with uv:
56
+
57
+ ```bash
58
+ uv tool install github-mcp-agent
59
+ ```
60
+
61
+ ---
62
+
63
+ ## Setup
64
+
65
+ ```bash
66
+ github-agent setup
67
+ ```
68
+
69
+ Interactive wizard:
70
+
71
+ 1. GitHub token (validated immediately)
72
+ 2. AI provider — choose one:
73
+ - **AWS Bedrock** — existing profile, access keys, or SSO
74
+ - **Anthropic API** — API key from console.anthropic.com
75
+ - **OpenAI** — API key from platform.openai.com
76
+ - **Google Gemini** — API key from aistudio.google.com
77
+ - **GitHub Copilot** — browser OAuth flow, requires a Copilot subscription
78
+ - **Local (Ollama)** — picks from your installed models, no API key needed
79
+ 3. Model selection (scrollable menu)
80
+ 4. Pulls the GitHub MCP Docker image
81
+
82
+ Config saved to `~/.config/github-mcp-agent/.env`.
83
+
84
+ ---
85
+
86
+ ## Usage
87
+
88
+ ```bash
89
+ github-agent # start the agent
90
+ github-agent setup # full setup wizard
91
+ github-agent provider # switch AI provider and model
92
+ github-agent model # switch model within current provider
93
+ github-agent token # update GitHub token
94
+ github-agent config # edit config file in $EDITOR
95
+ github-agent prompt # customize the system prompt in $EDITOR
96
+ github-agent -v # start with verbose tool output
97
+ ```
98
+
99
+ ---
100
+
101
+ ## Requirements
102
+
103
+ | Requirement | Notes |
104
+ |---|---|
105
+ | Python 3.10+ | |
106
+ | Docker | Must be running — used for the GitHub MCP server |
107
+ | GitHub token | Scopes: `repo`, `read:org`, `project` — [github.com/settings/tokens](https://github.com/settings/tokens) |
108
+ | Provider credentials | See setup wizard |
109
+
110
+ **For AWS Bedrock:** enable Claude model access in the [Bedrock console](https://console.aws.amazon.com/bedrock) under Model access.
111
+
112
+ **For Ollama:** install from [ollama.com](https://ollama.com), run `ollama serve`. Models with good tool-calling support: `qwen2.5`, `llama3.1`, `mistral`.
113
+
114
+ **For GitHub Copilot:** requires an active Copilot subscription (student pack, individual, or business).
115
+
116
+ ---
117
+
118
+ ## How it works
119
+
120
+ ```
121
+ You (terminal)
122
+
123
+
124
+ github-agent (CLI)
125
+
126
+ ├── AI model (Bedrock / Anthropic / OpenAI / Gemini / Copilot / Ollama)
127
+
128
+ └── GitHub MCP Server (Docker)
129
+
130
+ └── GitHub API
131
+ ```
132
+
133
+ Uses the [Strands Agents SDK](https://github.com/strands-agents/sdk-python) with the [GitHub MCP server](https://github.com/github/github-mcp-server).
134
+
135
+ ---
136
+
137
+ ## Troubleshooting
138
+
139
+ **`GITHUB_TOKEN` not set** — run `github-agent setup`
140
+
141
+ **Docker not running** — start Docker Desktop or `sudo systemctl start docker`
142
+
143
+ **Bedrock access denied** — check IAM permissions and model access in your region
144
+
145
+ **Ollama model not found** — run `ollama list` to confirm the model name, re-run `github-agent model`
146
+
147
+ **`No module named github_mcp_agent`** — reinstall with `pip install github-mcp-agent` or `uv tool install github-mcp-agent`
@@ -2,6 +2,8 @@
2
2
 
3
3
  Talk to your GitHub repos, issues, and project boards in plain English from your terminal.
4
4
 
5
+ ![GitHub MCP Agent demo](assets/demo1.png)
6
+
5
7
  ```
6
8
  You > list open issues in my raytracer repo
7
9
  You > set priority of issue #42 to urgent
@@ -14,9 +16,13 @@ You > which issues are assigned to maryam?
14
16
  ## Install
15
17
 
16
18
  ```bash
17
- git clone https://github.com/OmarCodes022/GitHub-MCP-Agent
18
- cd GitHub-MCP-Agent
19
- uv tool install . # or: pip install .
19
+ pip install github-mcp-agent
20
+ ```
21
+
22
+ Or with uv:
23
+
24
+ ```bash
25
+ uv tool install github-mcp-agent
20
26
  ```
21
27
 
22
28
  ---
@@ -35,7 +41,7 @@ Interactive wizard:
35
41
  - **Anthropic API** — API key from console.anthropic.com
36
42
  - **OpenAI** — API key from platform.openai.com
37
43
  - **Google Gemini** — API key from aistudio.google.com
38
- - **GitHub Copilot** — uses your GitHub token, requires a Copilot subscription
44
+ - **GitHub Copilot** — browser OAuth flow, requires a Copilot subscription
39
45
  - **Local (Ollama)** — picks from your installed models, no API key needed
40
46
  3. Model selection (scrollable menu)
41
47
  4. Pulls the GitHub MCP Docker image
@@ -105,4 +111,4 @@ Uses the [Strands Agents SDK](https://github.com/strands-agents/sdk-python) with
105
111
 
106
112
  **Ollama model not found** — run `ollama list` to confirm the model name, re-run `github-agent model`
107
113
 
108
- **`No module named github_mcp_agent`** — reinstall with `uv tool install .` from the project directory
114
+ **`No module named github_mcp_agent`** — reinstall with `pip install github-mcp-agent` or `uv tool install github-mcp-agent`
Binary file
Binary file
Binary file
@@ -29,4 +29,3 @@ def setup(provider: str, _ask) -> dict:
29
29
  if mod is None:
30
30
  raise RuntimeError(f"Unknown provider: {provider}")
31
31
  return mod.setup(_ask)
32
- pypi-AgEIcHlwaS5vcmcCJGU0ZDI1YWQ5LTEyOGMtNDUyZi1iNmZkLTEzOWU0MmRkNDIzOAACKlszLCJjZTAzNzUyYy00ZjNhLTQ3MTYtYjM2ZS02YmY0ZGNhZjkyMDciXQAABiD04xa6bIcHRFlnmMHzKPunpg81Z6OhNO_P102kWxtY9g
@@ -0,0 +1,117 @@
1
+ import json
2
+ import time
3
+ import urllib.error
4
+ import urllib.parse
5
+ import urllib.request
6
+
7
+ import questionary
8
+
9
+ MODELS = [
10
+ ("gpt-4o", "gpt-4o", "flagship"),
11
+ ("gpt-4o-mini", "gpt-4o-mini", "fast, cheap"),
12
+ ("claude-sonnet-4-5", "claude-sonnet-4-5", "Anthropic via Copilot"),
13
+ ("o3-mini", "o3-mini", "reasoning"),
14
+ ("gemini-1.5-pro", "gemini-1.5-pro", "Google via Copilot"),
15
+ ]
16
+
17
+ _CLIENT_ID = "Iv1.b507a08c87ecfe98"
18
+
19
+
20
+ def _device_flow() -> str:
21
+ """Run GitHub device flow with the Copilot OAuth client, return an access token."""
22
+ from rich.console import Console
23
+ console = Console()
24
+
25
+ data = urllib.parse.urlencode({"client_id": _CLIENT_ID, "scope": "read:user"}).encode()
26
+ req = urllib.request.Request(
27
+ "https://github.com/login/device/code",
28
+ data=data,
29
+ headers={"Accept": "application/json"},
30
+ )
31
+ with urllib.request.urlopen(req) as r:
32
+ device = json.loads(r.read())
33
+
34
+ console.print(f"\n Open: [bold cyan]{device['verification_uri']}[/bold cyan]")
35
+ console.print(f" Code: [bold yellow]{device['user_code']}[/bold yellow]\n")
36
+
37
+ interval = device.get("interval", 5)
38
+ deadline = time.time() + device.get("expires_in", 900)
39
+
40
+ while time.time() < deadline:
41
+ time.sleep(interval)
42
+ poll_data = urllib.parse.urlencode({
43
+ "client_id": _CLIENT_ID,
44
+ "device_code": device["device_code"],
45
+ "grant_type": "urn:ietf:params:oauth:grant-type:device_code",
46
+ }).encode()
47
+ poll_req = urllib.request.Request(
48
+ "https://github.com/login/oauth/access_token",
49
+ data=poll_data,
50
+ headers={"Accept": "application/json"},
51
+ )
52
+ with urllib.request.urlopen(poll_req) as r:
53
+ result = json.loads(r.read())
54
+
55
+ if "access_token" in result:
56
+ return result["access_token"]
57
+ error = result.get("error", "")
58
+ if error == "slow_down":
59
+ interval += 5
60
+ elif error not in ("authorization_pending",):
61
+ raise RuntimeError(f"Auth failed: {result.get('error_description', error)}")
62
+
63
+ raise RuntimeError("Authentication timed out.")
64
+
65
+
66
+ def _get_copilot_token(oauth_token: str) -> str:
67
+ """Exchange a Copilot OAuth token for a short-lived Copilot API token."""
68
+ req = urllib.request.Request("https://api.github.com/copilot_internal/v2/token")
69
+ req.add_header("Authorization", f"token {oauth_token}")
70
+ req.add_header("Accept", "application/json")
71
+ req.add_header("Editor-Version", "vscode/1.85.0")
72
+ req.add_header("Editor-Plugin-Version", "copilot/1.138.0")
73
+ req.add_header("User-Agent", "GithubCopilot/1.138.0")
74
+ try:
75
+ with urllib.request.urlopen(req) as r:
76
+ return json.loads(r.read())["token"]
77
+ except urllib.error.HTTPError as e:
78
+ raise RuntimeError(
79
+ f"Failed to get Copilot token (HTTP {e.code}).\n"
80
+ "Make sure you have an active Copilot subscription."
81
+ )
82
+
83
+
84
+ def build_model(model_id: str):
85
+ import os
86
+ from strands.models.litellm import LiteLLMModel
87
+ oauth_token = os.environ.get("COPILOT_OAUTH_TOKEN")
88
+ if not oauth_token:
89
+ raise RuntimeError("Copilot token not set. Run 'github-agent provider' and pick GitHub Copilot.")
90
+ token = _get_copilot_token(oauth_token)
91
+ return LiteLLMModel(
92
+ model_id=f"openai/{model_id}",
93
+ params={
94
+ "api_base": "https://api.githubcopilot.com",
95
+ "api_key": token,
96
+ "extra_headers": {
97
+ "Editor-Version": "vscode/1.85.0",
98
+ "Editor-Plugin-Version": "copilot/1.138.0",
99
+ "User-Agent": "GithubCopilot/1.138.0",
100
+ "Copilot-Integration-Id": "vscode-chat",
101
+ },
102
+ },
103
+ )
104
+
105
+
106
+ def setup(_ask) -> dict:
107
+ from rich.console import Console
108
+ console = Console()
109
+ console.print(" [dim]Requires an active Copilot subscription (student pack, individual, or business).[/dim]")
110
+ console.print(" [dim]Opening browser to authenticate with GitHub Copilot...[/dim]\n")
111
+
112
+ oauth_token = _device_flow()
113
+
114
+ model_choices = [f"{name} ({desc})" for _, name, desc in MODELS]
115
+ model_display = _ask(questionary.select, "Model:", choices=model_choices)
116
+ model_id = MODELS[model_choices.index(model_display)][0]
117
+ return {"COPILOT_OAUTH_TOKEN": oauth_token, "MODEL_ID": model_id}
@@ -0,0 +1,50 @@
1
+ [project]
2
+ name = "github-mcp-agent"
3
+ version = "0.2.1"
4
+ description = "Talk to your GitHub repos, issues, and project boards in plain English from your terminal"
5
+ readme = "README.md"
6
+ license = { text = "MIT" }
7
+ requires-python = ">=3.10"
8
+ authors = [{ name = "Omar Hany", email = "omarhanyabbas2004@gmail.com" }]
9
+ keywords = ["github", "ai", "agent", "mcp", "cli", "copilot"]
10
+ classifiers = [
11
+ "Development Status :: 4 - Beta",
12
+ "Environment :: Console",
13
+ "Intended Audience :: Developers",
14
+ "License :: OSI Approved :: MIT License",
15
+ "Programming Language :: Python :: 3",
16
+ "Programming Language :: Python :: 3.10",
17
+ "Programming Language :: Python :: 3.11",
18
+ "Programming Language :: Python :: 3.12",
19
+ "Topic :: Software Development",
20
+ "Topic :: Utilities",
21
+ ]
22
+ dependencies = [
23
+ "boto3",
24
+ "strands-agents",
25
+ "mcp",
26
+ "rich",
27
+ "python-dotenv",
28
+ "questionary",
29
+ "anthropic",
30
+ "litellm",
31
+ "click",
32
+ ]
33
+
34
+ [project.urls]
35
+ Homepage = "https://github.com/OmarCodes022/GitHub-MCP-Agent"
36
+ Repository = "https://github.com/OmarCodes022/GitHub-MCP-Agent"
37
+ Issues = "https://github.com/OmarCodes022/GitHub-MCP-Agent/issues"
38
+
39
+ [project.scripts]
40
+ github-agent = "github_mcp_agent.cli:main"
41
+
42
+ [build-system]
43
+ requires = ["hatchling"]
44
+ build-backend = "hatchling.build"
45
+
46
+ [tool.hatch.build.targets.wheel]
47
+ packages = ["github_mcp_agent"]
48
+
49
+ [tool.hatch.build.targets.wheel.sources]
50
+ "github_mcp_agent" = "github_mcp_agent"
@@ -1,14 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: github-mcp-agent
3
- Version: 0.1.0
4
- Summary: A GitHub AI agent powered by AWS Bedrock and MCP
5
- Requires-Python: >=3.10
6
- Requires-Dist: anthropic
7
- Requires-Dist: boto3
8
- Requires-Dist: click
9
- Requires-Dist: litellm
10
- Requires-Dist: mcp
11
- Requires-Dist: python-dotenv
12
- Requires-Dist: questionary
13
- Requires-Dist: rich
14
- Requires-Dist: strands-agents
@@ -1,32 +0,0 @@
1
- import os
2
-
3
- import questionary
4
-
5
- MODELS = [
6
- ("gpt-4o", "gpt-4o", "flagship"),
7
- ("gpt-4o-mini", "gpt-4o-mini", "fast, cheap"),
8
- ("claude-sonnet-4-5", "claude-sonnet-4-5", "Anthropic via Copilot"),
9
- ("o3-mini", "o3-mini", "reasoning"),
10
- ("gemini-1.5-pro", "gemini-1.5-pro", "Google via Copilot"),
11
- ]
12
-
13
-
14
- def build_model(model_id: str):
15
- from strands.models.litellm import LiteLLMModel
16
- token = os.environ.get("GITHUB_TOKEN")
17
- if not token:
18
- raise RuntimeError("GITHUB_TOKEN is not set. Run 'github-agent setup' to configure.")
19
- return LiteLLMModel(
20
- model_id=f"openai/{model_id}",
21
- params={"api_base": "https://api.githubcopilot.com", "api_key": token},
22
- )
23
-
24
-
25
- def setup(_ask) -> dict:
26
- from rich.console import Console
27
- console = Console()
28
- console.print(" [dim]Uses your GitHub token - no extra API key needed.[/dim]")
29
- console.print(" [dim]Requires an active Copilot subscription (student pack, individual, or business).[/dim]")
30
- model_choices = [f"{name} ({desc})" for _, name, desc in MODELS]
31
- model_display = _ask(questionary.select, "Model:", choices=model_choices)
32
- return {"MODEL_ID": MODELS[model_choices.index(model_display)][0]}
@@ -1,29 +0,0 @@
1
- [project]
2
- name = "github-mcp-agent"
3
- version = "0.1.0"
4
- description = "A GitHub AI agent powered by AWS Bedrock and MCP"
5
- requires-python = ">=3.10"
6
- dependencies = [
7
- "boto3",
8
- "strands-agents",
9
- "mcp",
10
- "rich",
11
- "python-dotenv",
12
- "questionary",
13
- "anthropic",
14
- "litellm",
15
- "click",
16
- ]
17
-
18
- [project.scripts]
19
- github-agent = "github_mcp_agent.cli:main"
20
-
21
- [build-system]
22
- requires = ["hatchling"]
23
- build-backend = "hatchling.build"
24
-
25
- [tool.hatch.build.targets.wheel]
26
- packages = ["github_mcp_agent"]
27
-
28
- [tool.hatch.build.targets.wheel.sources]
29
- "github_mcp_agent" = "github_mcp_agent"