@ldraney/github-mcp 0.2.0-beta.2 → 0.2.2

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 (49) hide show
  1. package/README.md +38 -1
  2. package/dist/auth/token-storage.js +34 -8
  3. package/dist/index.js +29 -6
  4. package/dist/prompts/help.d.ts +9 -0
  5. package/dist/prompts/help.js +86 -0
  6. package/dist/server.js +4 -1
  7. package/dist/tools/generator.d.ts +24 -0
  8. package/dist/tools/generator.js +59 -9
  9. package/package.json +2 -2
  10. package/dist/auth/oauth-device-flow.d.ts +0 -20
  11. package/dist/auth/oauth-device-flow.d.ts.map +0 -1
  12. package/dist/auth/oauth-device-flow.js +0 -141
  13. package/dist/auth/oauth-device-flow.js.map +0 -1
  14. package/dist/auth/token-storage.d.ts.map +0 -1
  15. package/dist/auth/token-storage.js.map +0 -1
  16. package/dist/index.d.ts.map +0 -1
  17. package/dist/index.js.map +0 -1
  18. package/dist/resources/webhooks.d.ts +0 -15
  19. package/dist/resources/webhooks.d.ts.map +0 -1
  20. package/dist/resources/webhooks.js +0 -194
  21. package/dist/resources/webhooks.js.map +0 -1
  22. package/dist/server.d.ts.map +0 -1
  23. package/dist/server.js.map +0 -1
  24. package/dist/tools/categories/actions.d.ts.map +0 -1
  25. package/dist/tools/categories/actions.js.map +0 -1
  26. package/dist/tools/categories/gists.d.ts.map +0 -1
  27. package/dist/tools/categories/gists.js.map +0 -1
  28. package/dist/tools/categories/issues.d.ts.map +0 -1
  29. package/dist/tools/categories/issues.js.map +0 -1
  30. package/dist/tools/categories/orgs.d.ts.map +0 -1
  31. package/dist/tools/categories/orgs.js.map +0 -1
  32. package/dist/tools/categories/pulls.d.ts.map +0 -1
  33. package/dist/tools/categories/pulls.js.map +0 -1
  34. package/dist/tools/categories/repos.d.ts.map +0 -1
  35. package/dist/tools/categories/repos.js.map +0 -1
  36. package/dist/tools/categories/search.d.ts.map +0 -1
  37. package/dist/tools/categories/search.js.map +0 -1
  38. package/dist/tools/categories/users.d.ts.map +0 -1
  39. package/dist/tools/categories/users.js.map +0 -1
  40. package/dist/tools/generator.d.ts.map +0 -1
  41. package/dist/tools/generator.js.map +0 -1
  42. package/dist/webhooks/event-queue.d.ts +0 -54
  43. package/dist/webhooks/event-queue.d.ts.map +0 -1
  44. package/dist/webhooks/event-queue.js +0 -117
  45. package/dist/webhooks/event-queue.js.map +0 -1
  46. package/dist/webhooks/smee-client.d.ts +0 -27
  47. package/dist/webhooks/smee-client.d.ts.map +0 -1
  48. package/dist/webhooks/smee-client.js +0 -153
  49. package/dist/webhooks/smee-client.js.map +0 -1
package/README.md CHANGED
@@ -45,7 +45,20 @@ Add to your Claude Desktop config:
45
45
  "mcpServers": {
46
46
  "github": {
47
47
  "command": "npx",
48
- "args": ["github-mcp"]
48
+ "args": ["@ldraney/github-mcp", "--preset", "core"]
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ For security-focused work:
55
+
56
+ ```json
57
+ {
58
+ "mcpServers": {
59
+ "github": {
60
+ "command": "npx",
61
+ "args": ["@ldraney/github-mcp", "--preset", "security"]
49
62
  }
50
63
  }
51
64
  }
@@ -66,6 +79,30 @@ github-mcp auth status # Check auth status
66
79
  GITHUB_TOKEN=ghp_xxx github-mcp
67
80
  ```
68
81
 
82
+ ### Presets
83
+
84
+ Claude Desktop has a ~100 tool limit. Use presets to load only what you need:
85
+
86
+ ```bash
87
+ github-mcp --preset core # Daily dev work (~95 tools)
88
+ github-mcp --preset security # Security audits (~50 tools)
89
+ github-mcp --preset org-admin # Org management (~70 tools)
90
+ github-mcp --preset cicd # CI/CD automation (~60 tools)
91
+ github-mcp --preset full # All 327 tools (Claude Code only)
92
+ ```
93
+
94
+ | Preset | Categories | Use Case |
95
+ |--------|-----------|----------|
96
+ | `core` (default) | repos, issues, pulls, search, users, actions, gists | Daily development |
97
+ | `security` | dependabot, secretScanning, codeScanning, codeSecurity, securityAdvisories | Security audits |
98
+ | `org-admin` | orgs, teams, projects, activity, users, apps | Organization management |
99
+ | `cicd` | actions, checks, repos, packages | CI/CD pipelines |
100
+ | `full` | all 32 categories | Claude Code with tool search |
101
+
102
+ List presets: `github-mcp --list-presets`
103
+
104
+ Override with custom categories: `github-mcp --categories repos,issues,pulls`
105
+
69
106
  ## Available Tools
70
107
 
71
108
  Tools are organized by GitHub API category:
@@ -1,4 +1,4 @@
1
- import keytar from 'keytar';
1
+ import { Entry } from '@napi-rs/keyring';
2
2
  const SERVICE_NAME = 'github-mcp';
3
3
  const ACCOUNT_NAME = 'oauth-token';
4
4
  const SCOPE_ACCOUNT = 'oauth-scopes';
@@ -6,28 +6,54 @@ const SCOPE_ACCOUNT = 'oauth-scopes';
6
6
  * Store token securely in OS keychain
7
7
  */
8
8
  export async function storeToken(token, scopes) {
9
- await keytar.setPassword(SERVICE_NAME, ACCOUNT_NAME, token);
9
+ const tokenEntry = new Entry(SERVICE_NAME, ACCOUNT_NAME);
10
+ tokenEntry.setPassword(token);
10
11
  if (scopes) {
11
- await keytar.setPassword(SERVICE_NAME, SCOPE_ACCOUNT, scopes);
12
+ const scopeEntry = new Entry(SERVICE_NAME, SCOPE_ACCOUNT);
13
+ scopeEntry.setPassword(scopes);
12
14
  }
13
15
  }
14
16
  /**
15
17
  * Retrieve token from OS keychain
16
18
  */
17
19
  export async function retrieveToken() {
18
- return keytar.getPassword(SERVICE_NAME, ACCOUNT_NAME);
20
+ try {
21
+ const entry = new Entry(SERVICE_NAME, ACCOUNT_NAME);
22
+ return entry.getPassword();
23
+ }
24
+ catch {
25
+ return null;
26
+ }
19
27
  }
20
28
  /**
21
29
  * Retrieve stored scopes
22
30
  */
23
31
  export async function retrieveScopes() {
24
- return keytar.getPassword(SERVICE_NAME, SCOPE_ACCOUNT);
32
+ try {
33
+ const entry = new Entry(SERVICE_NAME, SCOPE_ACCOUNT);
34
+ return entry.getPassword();
35
+ }
36
+ catch {
37
+ return null;
38
+ }
25
39
  }
26
40
  /**
27
41
  * Delete token from OS keychain
28
42
  */
29
43
  export async function deleteToken() {
30
- const tokenDeleted = await keytar.deletePassword(SERVICE_NAME, ACCOUNT_NAME);
31
- await keytar.deletePassword(SERVICE_NAME, SCOPE_ACCOUNT);
32
- return tokenDeleted;
44
+ try {
45
+ const tokenEntry = new Entry(SERVICE_NAME, ACCOUNT_NAME);
46
+ tokenEntry.deletePassword();
47
+ }
48
+ catch {
49
+ // Token didn't exist
50
+ }
51
+ try {
52
+ const scopeEntry = new Entry(SERVICE_NAME, SCOPE_ACCOUNT);
53
+ scopeEntry.deletePassword();
54
+ }
55
+ catch {
56
+ // Scopes didn't exist
57
+ }
58
+ return true;
33
59
  }
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import { Command } from 'commander';
3
3
  import { getToken, login, logout, getAuthStatus } from './auth/oauth-flow.js';
4
4
  import { startServer } from './server.js';
5
- import { ToolGenerator } from './tools/generator.js';
5
+ import { ToolGenerator, PRESETS, DEFAULT_PRESET } from './tools/generator.js';
6
6
  const program = new Command();
7
7
  program
8
8
  .name('github-mcp')
@@ -10,8 +10,19 @@ program
10
10
  .version('0.1.0');
11
11
  // Default command: start server
12
12
  program
13
- .option('-c, --categories <categories>', `Comma-separated list of tool categories to load (available: ${ToolGenerator.getAvailableCategories().join(', ')})`)
13
+ .option('-p, --preset <preset>', `Tool preset to load (${Object.keys(PRESETS).join(', ')})`, DEFAULT_PRESET)
14
+ .option('-c, --categories <categories>', `Comma-separated list of tool categories (overrides preset)`)
15
+ .option('--list-presets', 'Show available presets and exit')
14
16
  .action(async (options) => {
17
+ // Handle --list-presets
18
+ if (options.listPresets) {
19
+ console.log('Available presets:\n');
20
+ console.log(ToolGenerator.getPresetDescriptions());
21
+ console.log('\nUsage: npx @ldraney/github-mcp --preset <preset>');
22
+ console.log('\nFor Claude Desktop, use "core" (default) to stay under 100 tools.');
23
+ console.log('For Claude Code, use "full" for all 327 tools.');
24
+ process.exit(0);
25
+ }
15
26
  try {
16
27
  let token = await getToken();
17
28
  if (!token) {
@@ -22,10 +33,22 @@ program
22
33
  console.error('Authentication failed. Cannot start server.');
23
34
  process.exit(1);
24
35
  }
25
- // Parse categories if provided
26
- const categories = options.categories
27
- ? options.categories.split(',').map((c) => c.trim())
28
- : undefined;
36
+ // Determine categories: explicit categories override preset
37
+ let categories;
38
+ if (options.categories) {
39
+ categories = options.categories.split(',').map((c) => c.trim());
40
+ console.error(`Using custom categories: ${categories.join(', ')}`);
41
+ }
42
+ else {
43
+ const preset = options.preset || DEFAULT_PRESET;
44
+ categories = ToolGenerator.getPresetCategories(preset);
45
+ if (!categories) {
46
+ console.error(`Unknown preset: ${preset}`);
47
+ console.error(`Available presets: ${ToolGenerator.getAvailablePresets().join(', ')}`);
48
+ process.exit(1);
49
+ }
50
+ console.error(`Using preset: ${preset}`);
51
+ }
29
52
  await startServer(token, { categories });
30
53
  }
31
54
  catch (error) {
@@ -0,0 +1,9 @@
1
+ import type { Prompt, GetPromptResult } from '@modelcontextprotocol/sdk/types.js';
2
+ /**
3
+ * Help prompt definitions
4
+ */
5
+ export declare const helpPrompts: Prompt[];
6
+ /**
7
+ * Generate a help prompt result
8
+ */
9
+ export declare function getHelpPrompt(name: string, _args: Record<string, string>): GetPromptResult | null;
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Help prompt definitions
3
+ */
4
+ export const helpPrompts = [
5
+ {
6
+ name: 'github_help',
7
+ description: 'Get help using the GitHub MCP server - shows available capabilities and example queries',
8
+ arguments: [],
9
+ },
10
+ ];
11
+ /**
12
+ * Generate a help prompt result
13
+ */
14
+ export function getHelpPrompt(name, _args) {
15
+ if (name !== 'github_help') {
16
+ return null;
17
+ }
18
+ return {
19
+ messages: [
20
+ {
21
+ role: 'user',
22
+ content: {
23
+ type: 'text',
24
+ text: `Please explain what the GitHub MCP server can do and give me examples of how to use it.
25
+
26
+ The GitHub MCP server provides 327 tools across these categories:
27
+
28
+ ## Repository Management
29
+ - List, create, update, delete repositories
30
+ - Browse branches, commits, and file contents
31
+ - Compare commits and manage collaborators
32
+ - **Try:** "Show my 5 most recently updated repos" or "List branches on owner/repo"
33
+
34
+ ## Issues & Pull Requests
35
+ - List, create, update, close issues and PRs
36
+ - Add comments, labels, and assignees
37
+ - Review PRs and manage merge status
38
+ - **Try:** "Show open issues on owner/repo" or "Get details of PR #123"
39
+
40
+ ## Search
41
+ - Search repos, code, issues, users, commits
42
+ - **Try:** "Search for repos about 'machine learning' with 1000+ stars"
43
+
44
+ ## Actions & CI/CD
45
+ - List workflows, runs, jobs
46
+ - View logs, artifacts, secrets
47
+ - Cancel or re-run workflows
48
+ - **Try:** "Show recent workflow runs for owner/repo"
49
+
50
+ ## Organizations & Teams
51
+ - Manage org members, teams, permissions
52
+ - **Try:** "List members of my-org"
53
+
54
+ ## Activity & Notifications
55
+ - View repo events, stars, watchers
56
+ - Check notifications
57
+ - **Try:** "Show recent activity on owner/repo"
58
+
59
+ ## Security
60
+ - Dependabot alerts, code scanning, secret scanning
61
+ - Security advisories
62
+ - **Try:** "List Dependabot alerts for owner/repo"
63
+
64
+ ## And More...
65
+ - Gists, packages, projects, reactions
66
+ - Git data (blobs, trees, refs, tags)
67
+ - Rate limits, licenses, emojis
68
+
69
+ ## Pre-built Prompts
70
+ You can also use these prompts for common workflows:
71
+ - \`code_review\` - Review a PR with detailed feedback
72
+ - \`issue_triage\` - Analyze and categorize issues
73
+ - \`release_notes\` - Generate release notes between versions
74
+ - \`daily_summary\` / \`weekly_summary\` - Activity summaries
75
+
76
+ ## Tips
77
+ 1. Be specific: "List open issues labeled 'bug' on owner/repo"
78
+ 2. Use filters: "Show my repos sorted by stars"
79
+ 3. Chain actions: "Find the PR that fixed issue #42 and summarize it"
80
+
81
+ What would you like to do?`,
82
+ },
83
+ },
84
+ ],
85
+ };
86
+ }
package/dist/server.js CHANGED
@@ -7,8 +7,10 @@ import { activityPrompts, getActivityPrompt } from './prompts/activity-summary.j
7
7
  import { codeReviewPrompts, getCodeReviewPrompt } from './prompts/code-review.js';
8
8
  import { issueTriagePrompts, getIssueTriagePrompt } from './prompts/issue-triage.js';
9
9
  import { releaseNotesPrompts, getReleaseNotesPrompt } from './prompts/release-notes.js';
10
+ import { helpPrompts, getHelpPrompt } from './prompts/help.js';
10
11
  // Combine all prompts
11
12
  const allPrompts = [
13
+ ...helpPrompts,
12
14
  ...activityPrompts,
13
15
  ...codeReviewPrompts,
14
16
  ...issueTriagePrompts,
@@ -60,7 +62,8 @@ export async function startServer(token, options = {}) {
60
62
  const { name, arguments: args } = request.params;
61
63
  const promptArgs = args ?? {};
62
64
  // Try each prompt handler
63
- const result = getCodeReviewPrompt(name, promptArgs) ??
65
+ const result = getHelpPrompt(name, promptArgs) ??
66
+ getCodeReviewPrompt(name, promptArgs) ??
64
67
  getIssueTriagePrompt(name, promptArgs) ??
65
68
  getReleaseNotesPrompt(name, promptArgs) ??
66
69
  getActivityPrompt(name, promptArgs);
@@ -1,5 +1,17 @@
1
1
  import type { Octokit } from '@octokit/rest';
2
2
  import type { MCPToolDefinition, ToolResult } from './types.js';
3
+ /**
4
+ * Preset configurations for different use cases
5
+ * Each preset stays under ~100 tools for Claude Desktop compatibility
6
+ */
7
+ export declare const PRESETS: Record<string, {
8
+ description: string;
9
+ categories: string[];
10
+ }>;
11
+ /**
12
+ * Default preset for Claude Desktop compatibility
13
+ */
14
+ export declare const DEFAULT_PRESET = "core";
3
15
  /**
4
16
  * Tool generator that manages tool loading and execution
5
17
  */
@@ -27,6 +39,18 @@ export declare class ToolGenerator {
27
39
  * Get list of available category names
28
40
  */
29
41
  static getAvailableCategories(): string[];
42
+ /**
43
+ * Get list of available preset names
44
+ */
45
+ static getAvailablePresets(): string[];
46
+ /**
47
+ * Get categories for a preset
48
+ */
49
+ static getPresetCategories(preset: string): string[] | undefined;
50
+ /**
51
+ * Get preset descriptions for help text
52
+ */
53
+ static getPresetDescriptions(): string;
30
54
  /**
31
55
  * Get count of loaded tools
32
56
  */
@@ -39,16 +39,46 @@ const ALL_CATEGORIES = {
39
39
  codesOfConduct: codesOfConductCategory,
40
40
  };
41
41
  /**
42
- * Default categories to load if none specified
42
+ * Preset configurations for different use cases
43
+ * Each preset stays under ~100 tools for Claude Desktop compatibility
43
44
  */
44
- const DEFAULT_CATEGORIES = [
45
- 'repos', 'issues', 'pulls', 'users', 'actions', 'search', 'orgs',
46
- 'gists', 'checks', 'projects', 'teams', 'activity', 'git',
47
- 'reactions', 'packages', 'dependabot', 'secretScanning', 'codeScanning',
48
- 'codeSecurity', 'securityAdvisories', 'apps', 'billing', 'codespaces',
49
- 'copilot', 'migrations', 'interactions', 'rateLimit', 'markdown',
50
- 'meta', 'emojis', 'gitignore', 'licenses', 'codesOfConduct',
51
- ];
45
+ export const PRESETS = {
46
+ core: {
47
+ description: 'Essential tools for daily development (~95 tools)',
48
+ categories: ['repos', 'issues', 'pulls', 'search', 'users', 'actions', 'gists'],
49
+ },
50
+ security: {
51
+ description: 'Security scanning and vulnerability management (~50 tools)',
52
+ categories: ['dependabot', 'secretScanning', 'codeScanning', 'codeSecurity', 'securityAdvisories'],
53
+ },
54
+ 'org-admin': {
55
+ description: 'Organization and team management (~70 tools)',
56
+ categories: ['orgs', 'teams', 'projects', 'activity', 'users', 'apps'],
57
+ },
58
+ cicd: {
59
+ description: 'CI/CD and automation tools (~60 tools)',
60
+ categories: ['actions', 'checks', 'repos', 'packages'],
61
+ },
62
+ full: {
63
+ description: 'All 327 tools - recommended for Claude Code only',
64
+ categories: [
65
+ 'repos', 'issues', 'pulls', 'users', 'actions', 'search', 'orgs',
66
+ 'gists', 'checks', 'projects', 'teams', 'activity', 'git',
67
+ 'reactions', 'packages', 'dependabot', 'secretScanning', 'codeScanning',
68
+ 'codeSecurity', 'securityAdvisories', 'apps', 'billing', 'codespaces',
69
+ 'copilot', 'migrations', 'interactions', 'rateLimit', 'markdown',
70
+ 'meta', 'emojis', 'gitignore', 'licenses', 'codesOfConduct',
71
+ ],
72
+ },
73
+ };
74
+ /**
75
+ * Default preset for Claude Desktop compatibility
76
+ */
77
+ export const DEFAULT_PRESET = 'core';
78
+ /**
79
+ * Default categories to load if none specified (uses core preset)
80
+ */
81
+ const DEFAULT_CATEGORIES = PRESETS[DEFAULT_PRESET].categories;
52
82
  /**
53
83
  * Tool generator that manages tool loading and execution
54
84
  */
@@ -107,6 +137,26 @@ export class ToolGenerator {
107
137
  static getAvailableCategories() {
108
138
  return Object.keys(ALL_CATEGORIES);
109
139
  }
140
+ /**
141
+ * Get list of available preset names
142
+ */
143
+ static getAvailablePresets() {
144
+ return Object.keys(PRESETS);
145
+ }
146
+ /**
147
+ * Get categories for a preset
148
+ */
149
+ static getPresetCategories(preset) {
150
+ return PRESETS[preset]?.categories;
151
+ }
152
+ /**
153
+ * Get preset descriptions for help text
154
+ */
155
+ static getPresetDescriptions() {
156
+ return Object.entries(PRESETS)
157
+ .map(([name, config]) => ` ${name}: ${config.description}`)
158
+ .join('\n');
159
+ }
110
160
  /**
111
161
  * Get count of loaded tools
112
162
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ldraney/github-mcp",
3
- "version": "0.2.0-beta.2",
3
+ "version": "0.2.2",
4
4
  "description": "GitHub MCP server with OAuth and 800+ API endpoints",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -39,7 +39,7 @@
39
39
  "@modelcontextprotocol/sdk": "^1.0.0",
40
40
  "@octokit/rest": "^21.0.0",
41
41
  "commander": "^12.1.0",
42
- "keytar": "^7.9.0",
42
+ "@napi-rs/keyring": "^1.2.0",
43
43
  "open": "^10.1.0"
44
44
  },
45
45
  "devDependencies": {
@@ -1,20 +0,0 @@
1
- export interface DeviceFlowVerification {
2
- device_code: string;
3
- user_code: string;
4
- verification_uri: string;
5
- expires_in: number;
6
- interval: number;
7
- }
8
- /**
9
- * Perform OAuth Device Flow authentication
10
- */
11
- export declare function login(): Promise<string | null>;
12
- /**
13
- * Remove stored credentials
14
- */
15
- export declare function logout(): Promise<void>;
16
- /**
17
- * Check and display authentication status
18
- */
19
- export declare function getAuthStatus(): Promise<void>;
20
- //# sourceMappingURL=oauth-device-flow.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-device-flow.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-device-flow.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4DpD;AAED;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ5C;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BnD"}
@@ -1,141 +0,0 @@
1
- import { createOAuthDeviceAuth } from '@octokit/auth-oauth-device';
2
- import { Octokit } from '@octokit/rest';
3
- import { setToken, getToken, deleteToken } from './token-storage.js';
4
- // Default GitHub OAuth App client ID
5
- // Users should register their own OAuth App for production use
6
- const DEFAULT_CLIENT_ID = process.env.GITHUB_CLIENT_ID || 'Ov23liXXXXXXXXXXXXXX';
7
- // Scopes needed for full GitHub API access
8
- const SCOPES = [
9
- 'repo',
10
- 'read:org',
11
- 'read:user',
12
- 'user:email',
13
- 'read:project',
14
- 'write:discussion',
15
- 'gist',
16
- 'notifications',
17
- 'workflow',
18
- 'read:packages',
19
- 'admin:repo_hook',
20
- 'admin:org_hook',
21
- ];
22
- /**
23
- * Perform OAuth Device Flow authentication
24
- */
25
- export async function login() {
26
- const clientId = process.env.GITHUB_CLIENT_ID || DEFAULT_CLIENT_ID;
27
- if (clientId === DEFAULT_CLIENT_ID || clientId.startsWith('Ov23liXXXX')) {
28
- console.error('\nāš ļø No GITHUB_CLIENT_ID set. Please register an OAuth App:');
29
- console.error(' 1. Go to https://github.com/settings/developers');
30
- console.error(' 2. Click "New OAuth App"');
31
- console.error(' 3. Set callback URL to: http://localhost/callback');
32
- console.error(' 4. Enable "Device Flow" in the app settings');
33
- console.error(' 5. Set GITHUB_CLIENT_ID environment variable\n');
34
- return null;
35
- }
36
- console.error('\nšŸ” Starting GitHub OAuth Device Flow...\n');
37
- try {
38
- const auth = createOAuthDeviceAuth({
39
- clientType: 'oauth-app',
40
- clientId,
41
- scopes: SCOPES,
42
- onVerification: (verification) => {
43
- console.error('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
44
- console.error('');
45
- console.error(' šŸ“‹ Your verification code:');
46
- console.error('');
47
- console.error(` ${verification.user_code}`);
48
- console.error('');
49
- console.error(' 🌐 Open this URL in your browser:');
50
- console.error('');
51
- console.error(` ${verification.verification_uri}`);
52
- console.error('');
53
- console.error(' ā³ Waiting for authorization...');
54
- console.error('');
55
- console.error('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
56
- // Try to open browser automatically
57
- openBrowser(verification.verification_uri);
58
- },
59
- });
60
- const { token } = await auth({ type: 'oauth' });
61
- // Store token securely
62
- await setToken(token);
63
- // Verify token works
64
- const octokit = new Octokit({ auth: token });
65
- const { data: user } = await octokit.users.getAuthenticated();
66
- console.error('');
67
- console.error(`āœ… Successfully authenticated as: ${user.login}`);
68
- console.error(' Token stored securely in OS keychain');
69
- console.error('');
70
- return token;
71
- }
72
- catch (error) {
73
- const message = error instanceof Error ? error.message : 'Unknown error';
74
- console.error(`\nāŒ Authentication failed: ${message}\n`);
75
- return null;
76
- }
77
- }
78
- /**
79
- * Remove stored credentials
80
- */
81
- export async function logout() {
82
- const deleted = await deleteToken();
83
- if (deleted) {
84
- console.error('āœ… Logged out. Token removed from keychain.');
85
- }
86
- else {
87
- console.error('ā„¹ļø No stored credentials found.');
88
- }
89
- }
90
- /**
91
- * Check and display authentication status
92
- */
93
- export async function getAuthStatus() {
94
- const token = process.env.GITHUB_TOKEN || await getToken();
95
- if (!token) {
96
- console.error('āŒ Not authenticated');
97
- console.error(' Run: github-mcp auth login');
98
- return;
99
- }
100
- try {
101
- const octokit = new Octokit({ auth: token });
102
- const { data: user } = await octokit.users.getAuthenticated();
103
- console.error('āœ… Authenticated');
104
- console.error(` User: ${user.login}`);
105
- console.error(` Name: ${user.name || 'Not set'}`);
106
- console.error(` Email: ${user.email || 'Not public'}`);
107
- if (process.env.GITHUB_TOKEN) {
108
- console.error(' Source: GITHUB_TOKEN environment variable');
109
- }
110
- else {
111
- console.error(' Source: OS keychain');
112
- }
113
- }
114
- catch (error) {
115
- console.error('āŒ Token is invalid or expired');
116
- console.error(' Run: github-mcp auth login');
117
- }
118
- }
119
- /**
120
- * Open URL in default browser (cross-platform)
121
- */
122
- function openBrowser(url) {
123
- const { exec } = require('child_process');
124
- const platform = process.platform;
125
- let command;
126
- if (platform === 'darwin') {
127
- command = `open "${url}"`;
128
- }
129
- else if (platform === 'win32') {
130
- command = `start "${url}"`;
131
- }
132
- else {
133
- command = `xdg-open "${url}"`;
134
- }
135
- exec(command, (error) => {
136
- if (error) {
137
- // Silent fail - user can manually open the URL
138
- }
139
- });
140
- }
141
- //# sourceMappingURL=oauth-device-flow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-device-flow.js","sourceRoot":"","sources":["../../src/auth/oauth-device-flow.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-storage.d.ts","sourceRoot":"","sources":["../../src/auth/token-storage.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEvD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAEpD;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAGjD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-storage.js","sourceRoot":"","sources":["../../src/auth/token-storage.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,YAAY,GAAG,YAAY,CAAC;AAClC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAa;IAC1C,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,MAAM,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC/B,OAAO,KAAK,KAAK,IAAI,CAAC;AACxB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE3E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,qEAAqE,CAAC;KAClF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACrC,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,kBAAkB,EAAE,4BAA4B,CAAC;KACxD,MAAM,CAAC,qBAAqB,EAAE,mDAAmD,CAAC;KAClF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yBAAyB,CAAC;KACtC,UAAU,CACT,IAAI,OAAO,CAAC,OAAO,CAAC;KACjB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,KAAK,EAAE,CAAC;AAChB,CAAC,CAAC,CACL;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,EAAE,CAAC;AACjB,CAAC,CAAC,CACL;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC,CAAC,CACL,CAAC;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1,15 +0,0 @@
1
- import { Resource } from '@modelcontextprotocol/sdk/types.js';
2
- export interface WebhookResourceContents {
3
- uri: string;
4
- mimeType: string;
5
- text: string;
6
- }
7
- /**
8
- * Get all webhook-related resources
9
- */
10
- export declare function getWebhookResources(): Resource[];
11
- /**
12
- * Read a webhook resource
13
- */
14
- export declare function readWebhookResource(uri: string): WebhookResourceContents;
15
- //# sourceMappingURL=webhooks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/resources/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAG9D,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAGD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,QAAQ,EAAE,CA4ChD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAiExE"}