@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
@@ -1,117 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- const MAX_EVENTS_PER_TYPE = 100;
3
- class EventQueue extends EventEmitter {
4
- events = new Map();
5
- allEvents = [];
6
- /**
7
- * Add an event to the queue
8
- */
9
- push(event) {
10
- // Add to all events
11
- this.allEvents.unshift(event);
12
- if (this.allEvents.length > MAX_EVENTS_PER_TYPE * 10) {
13
- this.allEvents = this.allEvents.slice(0, MAX_EVENTS_PER_TYPE * 10);
14
- }
15
- // Add to type-specific queue
16
- const typeEvents = this.events.get(event.type) || [];
17
- typeEvents.unshift(event);
18
- if (typeEvents.length > MAX_EVENTS_PER_TYPE) {
19
- typeEvents.pop();
20
- }
21
- this.events.set(event.type, typeEvents);
22
- // Emit event for subscribers
23
- this.emit('event', event);
24
- this.emit(event.type, event);
25
- }
26
- /**
27
- * Get events by type
28
- */
29
- getByType(type, limit = 50) {
30
- const events = this.events.get(type) || [];
31
- return events.slice(0, limit);
32
- }
33
- /**
34
- * Get all events
35
- */
36
- getAll(limit = 50) {
37
- return this.allEvents.slice(0, limit);
38
- }
39
- /**
40
- * Get events by repository
41
- */
42
- getByRepo(owner, repo, limit = 50) {
43
- return this.allEvents
44
- .filter(e => e.repository?.owner === owner && e.repository?.name === repo)
45
- .slice(0, limit);
46
- }
47
- /**
48
- * Get available event types
49
- */
50
- getEventTypes() {
51
- return Array.from(this.events.keys());
52
- }
53
- /**
54
- * Clear all events
55
- */
56
- clear() {
57
- this.events.clear();
58
- this.allEvents = [];
59
- }
60
- /**
61
- * Get event counts by type
62
- */
63
- getCounts() {
64
- const counts = {};
65
- for (const [type, events] of this.events) {
66
- counts[type] = events.length;
67
- }
68
- return counts;
69
- }
70
- }
71
- // Singleton instance
72
- export const eventQueue = new EventQueue();
73
- // Common webhook event types
74
- export const EVENT_TYPES = [
75
- 'push',
76
- 'pull_request',
77
- 'pull_request_review',
78
- 'pull_request_review_comment',
79
- 'issues',
80
- 'issue_comment',
81
- 'create',
82
- 'delete',
83
- 'fork',
84
- 'release',
85
- 'workflow_run',
86
- 'workflow_job',
87
- 'check_run',
88
- 'check_suite',
89
- 'deployment',
90
- 'deployment_status',
91
- 'discussion',
92
- 'discussion_comment',
93
- 'label',
94
- 'milestone',
95
- 'project',
96
- 'project_card',
97
- 'project_column',
98
- 'public',
99
- 'star',
100
- 'watch',
101
- 'repository',
102
- 'team',
103
- 'team_add',
104
- 'member',
105
- 'membership',
106
- 'organization',
107
- 'org_block',
108
- 'package',
109
- 'page_build',
110
- 'ping',
111
- 'sponsorship',
112
- 'status',
113
- 'commit_comment',
114
- 'gollum', // wiki events
115
- 'meta',
116
- ];
117
- //# sourceMappingURL=event-queue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-queue.js","sourceRoot":"","sources":["../../src/webhooks/event-queue.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- import { WebhookEvent } from './event-queue.js';
2
- import { Resource } from '@modelcontextprotocol/sdk/types.js';
3
- /**
4
- * Start the smee.io webhook client
5
- */
6
- export declare function startWebhookClient(url: string): void;
7
- /**
8
- * Stop the webhook client
9
- */
10
- export declare function stopWebhookClient(): void;
11
- /**
12
- * Get the current smee URL
13
- */
14
- export declare function getSmeeUrl(): string | null;
15
- /**
16
- * Get webhook resources for MCP
17
- */
18
- export declare function getWebhookResources(): Resource[];
19
- /**
20
- * Get webhook events for a resource URI
21
- */
22
- export declare function getWebhookEvents(uri: string): WebhookEvent[] | Record<string, unknown>;
23
- /**
24
- * Generate a new smee.io channel URL
25
- */
26
- export declare function createSmeeChannel(): Promise<string>;
27
- //# sourceMappingURL=smee-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smee-client.d.ts","sourceRoot":"","sources":["../../src/webhooks/smee-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAK9D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAiCpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAOxC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAE1C;AAwCD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,QAAQ,EAAE,CAmChD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAatF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAYzD"}
@@ -1,153 +0,0 @@
1
- import SmeeClient from 'smee-client';
2
- import { eventQueue } from './event-queue.js';
3
- let smeeClient = null;
4
- let smeeUrl = null;
5
- /**
6
- * Start the smee.io webhook client
7
- */
8
- export function startWebhookClient(url) {
9
- if (smeeClient) {
10
- console.error('Webhook client already running');
11
- return;
12
- }
13
- smeeUrl = url;
14
- smeeClient = new SmeeClient({
15
- source: url,
16
- target: 'http://localhost:0/webhook', // Dummy target, we intercept events
17
- logger: {
18
- info: (msg) => console.error(`[smee] ${msg}`),
19
- error: (msg) => console.error(`[smee:error] ${msg}`),
20
- },
21
- });
22
- const events = smeeClient.start();
23
- events.addEventListener('message', (event) => {
24
- try {
25
- const data = JSON.parse(event.data);
26
- handleWebhookEvent(data);
27
- }
28
- catch {
29
- // Ignore parsing errors
30
- }
31
- });
32
- events.addEventListener('error', () => {
33
- console.error('[smee:error] Connection error');
34
- });
35
- console.error(`Webhook client started: ${url}`);
36
- }
37
- /**
38
- * Stop the webhook client
39
- */
40
- export function stopWebhookClient() {
41
- if (smeeClient) {
42
- // SmeeClient doesn't have a stop method, but we can clear the reference
43
- smeeClient = null;
44
- smeeUrl = null;
45
- console.error('Webhook client stopped');
46
- }
47
- }
48
- /**
49
- * Get the current smee URL
50
- */
51
- export function getSmeeUrl() {
52
- return smeeUrl;
53
- }
54
- /**
55
- * Handle incoming webhook event
56
- */
57
- function handleWebhookEvent(rawEvent) {
58
- try {
59
- const eventType = rawEvent['x-github-event'] || 'unknown';
60
- const deliveryId = rawEvent['x-github-delivery'] || crypto.randomUUID();
61
- const body = rawEvent.body || rawEvent;
62
- const event = {
63
- id: deliveryId,
64
- type: eventType,
65
- action: body.action,
66
- payload: body,
67
- receivedAt: new Date(),
68
- repository: body.repository ? {
69
- owner: body.repository.owner
70
- ? body.repository.owner.login
71
- : '',
72
- name: body.repository.name || '',
73
- full_name: body.repository.full_name || '',
74
- } : undefined,
75
- sender: body.sender ? {
76
- login: body.sender.login || '',
77
- id: body.sender.id || 0,
78
- } : undefined,
79
- };
80
- eventQueue.push(event);
81
- const action = event.action ? ` (${event.action})` : '';
82
- const repo = event.repository?.full_name ? ` in ${event.repository.full_name}` : '';
83
- console.error(`[webhook] ${eventType}${action}${repo}`);
84
- }
85
- catch (error) {
86
- console.error('[webhook:error] Failed to process event:', error);
87
- }
88
- }
89
- /**
90
- * Get webhook resources for MCP
91
- */
92
- export function getWebhookResources() {
93
- const resources = [
94
- {
95
- uri: 'github://webhooks/all',
96
- name: 'All Webhook Events',
97
- description: 'All recent webhook events from GitHub',
98
- mimeType: 'application/json',
99
- },
100
- ];
101
- // Add resources for each event type that has events
102
- const eventTypes = eventQueue.getEventTypes();
103
- for (const type of eventTypes) {
104
- resources.push({
105
- uri: `github://webhooks/${type}`,
106
- name: `${type} Events`,
107
- description: `Recent ${type} webhook events`,
108
- mimeType: 'application/json',
109
- });
110
- }
111
- // Add common event types even if empty
112
- const commonTypes = ['push', 'pull_request', 'issues', 'issue_comment', 'release', 'workflow_run'];
113
- for (const type of commonTypes) {
114
- if (!eventTypes.includes(type)) {
115
- resources.push({
116
- uri: `github://webhooks/${type}`,
117
- name: `${type} Events`,
118
- description: `Recent ${type} webhook events (none received yet)`,
119
- mimeType: 'application/json',
120
- });
121
- }
122
- }
123
- return resources;
124
- }
125
- /**
126
- * Get webhook events for a resource URI
127
- */
128
- export function getWebhookEvents(uri) {
129
- const match = uri.match(/^github:\/\/webhooks\/(.+)$/);
130
- if (!match) {
131
- return { error: 'Invalid webhook resource URI' };
132
- }
133
- const type = match[1];
134
- if (type === 'all') {
135
- return eventQueue.getAll();
136
- }
137
- return eventQueue.getByType(type);
138
- }
139
- /**
140
- * Generate a new smee.io channel URL
141
- */
142
- export async function createSmeeChannel() {
143
- const response = await fetch('https://smee.io/new', {
144
- method: 'HEAD',
145
- redirect: 'manual',
146
- });
147
- const location = response.headers.get('location');
148
- if (!location) {
149
- throw new Error('Failed to create smee.io channel');
150
- }
151
- return location;
152
- }
153
- //# sourceMappingURL=smee-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smee-client.js","sourceRoot":"","sources":["../../src/webhooks/smee-client.ts"],"names":[],"mappings":"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"}