@access-mcp/events 0.1.0

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.
package/README.md ADDED
@@ -0,0 +1,199 @@
1
+ # ACCESS-CI Events MCP Server
2
+
3
+ A Model Context Protocol server providing access to ACCESS-CI events data including workshops, webinars, and training sessions with comprehensive filtering capabilities.
4
+
5
+ ## Features
6
+
7
+ ### 🔧 Tools
8
+
9
+ - **`get_events`** - Get ACCESS-CI events with comprehensive filtering
10
+ - **`get_upcoming_events`** - Get upcoming events (today onward)
11
+ - **`search_events`** - Search events by keywords in title/description
12
+ - **`get_events_by_tag`** - Get events filtered by specific tags
13
+
14
+ ### 📊 Resources
15
+
16
+ - **`accessci://events`** - All events data
17
+ - **`accessci://events/upcoming`** - Upcoming events only
18
+ - **`accessci://events/workshops`** - Workshop events only
19
+ - **`accessci://events/webinars`** - Webinar events only
20
+
21
+ ## Installation
22
+
23
+ ```bash
24
+ npm install -g @access-mcp/events
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ ### Claude Desktop Configuration
30
+
31
+ Add to your Claude Desktop configuration:
32
+
33
+ ```json
34
+ {
35
+ "mcpServers": {
36
+ "access-events": {
37
+ "command": "npx",
38
+ "args": ["@access-mcp/events"]
39
+ }
40
+ }
41
+ }
42
+ ```
43
+
44
+ ### Example Queries
45
+
46
+ **Get upcoming events:**
47
+
48
+ ```
49
+ What events are coming up in the next week?
50
+ ```
51
+
52
+ **Search for specific topics:**
53
+
54
+ ```
55
+ Find upcoming Python workshops
56
+ ```
57
+
58
+ **Filter by skill level:**
59
+
60
+ ```
61
+ Show me beginner-level events this month
62
+ ```
63
+
64
+ **Get events by tags:**
65
+
66
+ ```
67
+ Find all machine learning events
68
+ ```
69
+
70
+ ## Filtering Capabilities
71
+
72
+ ### Date Filtering
73
+
74
+ **Relative Dates (Dynamic):**
75
+
76
+ - `today` - Current date
77
+ - `+1week`, `+2week` - Future weeks
78
+ - `+1month`, `+2month` - Future months
79
+ - `+1year` - Future year
80
+ - `-1week`, `-1month` - Past periods
81
+
82
+ **Absolute Dates (Fixed):**
83
+
84
+ - `YYYY-MM-DD` format (e.g., "2024-08-30")
85
+ - `YYYY-MM-DD HH:MM:SS` format with time
86
+
87
+ **Mixed Filtering:**
88
+ You can combine relative and absolute dates in the same query.
89
+
90
+ ### Faceted Search Filters
91
+
92
+ - **Event Type:** workshop, webinar, etc.
93
+ - **Event Affiliation:** Community, ACCESS, etc.
94
+ - **Skill Level:** beginner, intermediate, advanced
95
+ - **Event Tags:** python, big-data, machine-learning, gpu, etc.
96
+
97
+ ## API Details
98
+
99
+ ### Event Object Structure
100
+
101
+ Each event contains:
102
+
103
+ - `id` - Unique identifier
104
+ - `title` - Event title
105
+ - `description` - Event description
106
+ - `date` - Start date/time (ISO 8601)
107
+ - `date_1` - End date/time (ISO 8601)
108
+ - `location` - Event location
109
+ - `event_type` - Type of event
110
+ - `event_affiliation` - Organizational affiliation
111
+ - `custom_event_tags` - Comma-separated tags
112
+ - `skill_level` - Required skill level
113
+ - `speakers` - Event speakers
114
+ - `contact` - Contact information
115
+ - `registration` - Registration URL/info
116
+ - `created` - Creation timestamp
117
+ - `changed` - Last modified timestamp
118
+
119
+ ### Enhanced Fields
120
+
121
+ The server adds these computed fields:
122
+
123
+ - `start_date` - Parsed start date object
124
+ - `end_date` - Parsed end date object
125
+ - `tags` - Tags split into array
126
+ - `duration_hours` - Calculated event duration
127
+ - `starts_in_hours` - Hours until event starts
128
+
129
+ ## Examples
130
+
131
+ ### Get Events with Multiple Filters
132
+
133
+ ```typescript
134
+ // Get Python workshops for beginners in the next month
135
+ {
136
+ "tool": "get_events",
137
+ "arguments": {
138
+ "beginning_date_relative": "today",
139
+ "end_date_relative": "+1month",
140
+ "event_type": "workshop",
141
+ "skill_level": "beginner",
142
+ "event_tags": "python"
143
+ }
144
+ }
145
+ ```
146
+
147
+ ### Search Events
148
+
149
+ ```typescript
150
+ // Search for GPU-related events
151
+ {
152
+ "tool": "search_events",
153
+ "arguments": {
154
+ "query": "GPU computing",
155
+ "beginning_date_relative": "today",
156
+ "limit": 10
157
+ }
158
+ }
159
+ ```
160
+
161
+ ### Get Events by Tag
162
+
163
+ ```typescript
164
+ // Get all machine learning events this month
165
+ {
166
+ "tool": "get_events_by_tag",
167
+ "arguments": {
168
+ "tag": "machine-learning",
169
+ "time_range": "this_month",
170
+ "limit": 20
171
+ }
172
+ }
173
+ ```
174
+
175
+ ## Development
176
+
177
+ ```bash
178
+ # Build the server
179
+ npm run build
180
+
181
+ # Run in development
182
+ npm run dev
183
+
184
+ # Test the server
185
+ npm test
186
+ ```
187
+
188
+ ## Base URL
189
+
190
+ The server connects to: `https://support.access-ci.org/api/2.0/events`
191
+
192
+ ## Technical Notes
193
+
194
+ - All date comparisons use the event's start date (`date` field)
195
+ - Results include both upcoming and past events unless date filtered
196
+ - Faceted search filters use AND logic when combined
197
+ - Response times are typically under 5 seconds
198
+ - No pagination - all matching events are returned
199
+ - URL encoding is handled automatically for special characters
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import { EventsServer } from "./server.js";
3
+ async function main() {
4
+ const server = new EventsServer();
5
+ await server.start();
6
+ }
7
+ if (import.meta.url === `file://${process.argv[1]}`) {
8
+ main().catch((error) => {
9
+ console.error("Server error:", error);
10
+ process.exit(1);
11
+ });
12
+ }
@@ -0,0 +1,184 @@
1
+ import { BaseAccessServer } from "@access-mcp/shared";
2
+ import { AxiosInstance } from "axios";
3
+ export declare class EventsServer extends BaseAccessServer {
4
+ private _eventsHttpClient?;
5
+ constructor();
6
+ protected get httpClient(): AxiosInstance;
7
+ protected getTools(): ({
8
+ name: string;
9
+ description: string;
10
+ inputSchema: {
11
+ type: string;
12
+ properties: {
13
+ beginning_date_relative: {
14
+ type: string;
15
+ description: string;
16
+ enum: string[];
17
+ default?: undefined;
18
+ };
19
+ end_date_relative: {
20
+ type: string;
21
+ description: string;
22
+ enum: string[];
23
+ };
24
+ beginning_date: {
25
+ type: string;
26
+ description: string;
27
+ };
28
+ end_date: {
29
+ type: string;
30
+ description: string;
31
+ };
32
+ event_type: {
33
+ type: string;
34
+ description: string;
35
+ };
36
+ event_affiliation: {
37
+ type: string;
38
+ description: string;
39
+ };
40
+ skill_level: {
41
+ type: string;
42
+ description: string;
43
+ enum: string[];
44
+ };
45
+ event_tags: {
46
+ type: string;
47
+ description: string;
48
+ };
49
+ limit: {
50
+ type: string;
51
+ description: string;
52
+ minimum: number;
53
+ maximum: number;
54
+ };
55
+ query?: undefined;
56
+ tag?: undefined;
57
+ time_range?: undefined;
58
+ };
59
+ required: never[];
60
+ };
61
+ } | {
62
+ name: string;
63
+ description: string;
64
+ inputSchema: {
65
+ type: string;
66
+ properties: {
67
+ limit: {
68
+ type: string;
69
+ description: string;
70
+ minimum: number;
71
+ maximum: number;
72
+ };
73
+ event_type: {
74
+ type: string;
75
+ description: string;
76
+ };
77
+ beginning_date_relative?: undefined;
78
+ end_date_relative?: undefined;
79
+ beginning_date?: undefined;
80
+ end_date?: undefined;
81
+ event_affiliation?: undefined;
82
+ skill_level?: undefined;
83
+ event_tags?: undefined;
84
+ query?: undefined;
85
+ tag?: undefined;
86
+ time_range?: undefined;
87
+ };
88
+ required: never[];
89
+ };
90
+ } | {
91
+ name: string;
92
+ description: string;
93
+ inputSchema: {
94
+ type: string;
95
+ properties: {
96
+ query: {
97
+ type: string;
98
+ description: string;
99
+ };
100
+ beginning_date_relative: {
101
+ type: string;
102
+ description: string;
103
+ default: string;
104
+ enum?: undefined;
105
+ };
106
+ limit: {
107
+ type: string;
108
+ description: string;
109
+ minimum: number;
110
+ maximum: number;
111
+ };
112
+ end_date_relative?: undefined;
113
+ beginning_date?: undefined;
114
+ end_date?: undefined;
115
+ event_type?: undefined;
116
+ event_affiliation?: undefined;
117
+ skill_level?: undefined;
118
+ event_tags?: undefined;
119
+ tag?: undefined;
120
+ time_range?: undefined;
121
+ };
122
+ required: string[];
123
+ };
124
+ } | {
125
+ name: string;
126
+ description: string;
127
+ inputSchema: {
128
+ type: string;
129
+ properties: {
130
+ tag: {
131
+ type: string;
132
+ description: string;
133
+ };
134
+ time_range: {
135
+ type: string;
136
+ description: string;
137
+ enum: string[];
138
+ default: string;
139
+ };
140
+ limit: {
141
+ type: string;
142
+ description: string;
143
+ minimum: number;
144
+ maximum: number;
145
+ };
146
+ beginning_date_relative?: undefined;
147
+ end_date_relative?: undefined;
148
+ beginning_date?: undefined;
149
+ end_date?: undefined;
150
+ event_type?: undefined;
151
+ event_affiliation?: undefined;
152
+ skill_level?: undefined;
153
+ event_tags?: undefined;
154
+ query?: undefined;
155
+ };
156
+ required: string[];
157
+ };
158
+ })[];
159
+ protected getResources(): {
160
+ uri: string;
161
+ name: string;
162
+ description: string;
163
+ mimeType: string;
164
+ }[];
165
+ handleToolCall(request: any): Promise<{
166
+ content: {
167
+ type: string;
168
+ text: string;
169
+ }[];
170
+ }>;
171
+ handleResourceRead(request: any): Promise<{
172
+ contents: {
173
+ uri: any;
174
+ mimeType: string;
175
+ text: string;
176
+ }[];
177
+ }>;
178
+ private buildEventsUrl;
179
+ private getEvents;
180
+ private getUpcomingEvents;
181
+ private searchEvents;
182
+ private getEventsByTag;
183
+ private getPopularTags;
184
+ }