@access-mcp/events 0.2.0 → 0.3.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 +99 -75
- package/dist/index.js +2 -1
- package/dist/server.d.ts +9 -148
- package/dist/server.js +87 -373
- package/package.json +2 -2
- package/src/__tests__/server.integration.test.ts +60 -145
- package/src/__tests__/server.test.ts +108 -466
- package/src/index.ts +2 -1
- package/src/server.ts +94 -433
package/README.md
CHANGED
|
@@ -6,10 +6,7 @@ A Model Context Protocol server providing access to ACCESS-CI events data includ
|
|
|
6
6
|
|
|
7
7
|
### 🔧 Tools
|
|
8
8
|
|
|
9
|
-
- **`
|
|
10
|
-
- **`get_upcoming_events`** - Get upcoming events (today onward)
|
|
11
|
-
- **`search_events`** - **Enhanced!** Search events using API's native full-text search across all content
|
|
12
|
-
- **`get_events_by_tag`** - Get events filtered by specific tags
|
|
9
|
+
- **`search_events`** - Comprehensive event search and filtering with native full-text search, date filters, topic/tag filtering, and more
|
|
13
10
|
|
|
14
11
|
### 📊 Resources
|
|
15
12
|
|
|
@@ -41,32 +38,24 @@ Add to your Claude Desktop configuration:
|
|
|
41
38
|
}
|
|
42
39
|
```
|
|
43
40
|
|
|
44
|
-
|
|
41
|
+
## Usage Examples
|
|
45
42
|
|
|
46
|
-
**
|
|
43
|
+
### **Search & Discovery**
|
|
47
44
|
|
|
48
45
|
```
|
|
49
|
-
|
|
46
|
+
"Upcoming events next week"
|
|
47
|
+
"Python workshops"
|
|
48
|
+
"Machine learning events"
|
|
49
|
+
"Office hours this week"
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
**
|
|
52
|
+
### **Filtering**
|
|
53
53
|
|
|
54
54
|
```
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
**Filter by skill level:**
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
Show me beginner-level events this month
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
**Get events by tags:**
|
|
67
|
-
|
|
68
|
-
```
|
|
69
|
-
Find all GPU computing events
|
|
55
|
+
"Beginner-level events this month"
|
|
56
|
+
"GPU computing events"
|
|
57
|
+
"Webinars in December"
|
|
58
|
+
"Advanced training sessions"
|
|
70
59
|
```
|
|
71
60
|
|
|
72
61
|
## Key Improvements
|
|
@@ -152,60 +141,94 @@ The server adds these computed fields:
|
|
|
152
141
|
- `duration_hours` - Calculated event duration
|
|
153
142
|
- `starts_in_hours` - Hours until event starts
|
|
154
143
|
|
|
155
|
-
##
|
|
156
|
-
|
|
157
|
-
###
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
144
|
+
## Tool Reference
|
|
145
|
+
|
|
146
|
+
### search_events
|
|
147
|
+
|
|
148
|
+
Comprehensive event search and filtering with native full-text search, date filters, and topic/tag filtering.
|
|
149
|
+
|
|
150
|
+
**Parameters:**
|
|
151
|
+
- `query` (string, optional): Search titles, descriptions, speakers, and tags
|
|
152
|
+
- `type` (string, optional): Filter by event type (workshop, webinar, training)
|
|
153
|
+
- `tags` (string, optional): Filter by tags (python, gpu, hpc, ml)
|
|
154
|
+
- `date` (string, optional): Filter by time period. Valid values: `today`, `upcoming`, `past`, `this_week`, `this_month`
|
|
155
|
+
- `skill` (string, optional): Filter by skill level. Valid values: `beginner`, `intermediate`, `advanced`
|
|
156
|
+
- `limit` (number, optional): Maximum results (default: 50, automatically rounded to API page sizes: 25, 50, 75, or 100)
|
|
157
|
+
|
|
158
|
+
## Usage Examples
|
|
159
|
+
|
|
160
|
+
### Full-Text Search
|
|
161
|
+
|
|
162
|
+
```javascript
|
|
163
|
+
// Upcoming Python events
|
|
164
|
+
search_events({
|
|
165
|
+
query: "python",
|
|
166
|
+
date: "upcoming",
|
|
167
|
+
limit: 10
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
// Machine learning workshops this month
|
|
171
|
+
search_events({
|
|
172
|
+
query: "machine learning",
|
|
173
|
+
date: "this_month",
|
|
174
|
+
type: "workshop",
|
|
175
|
+
limit: 25
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
// Past office hours
|
|
179
|
+
search_events({
|
|
180
|
+
query: "office hours",
|
|
181
|
+
date: "past",
|
|
182
|
+
limit: 30
|
|
183
|
+
})
|
|
171
184
|
```
|
|
172
185
|
|
|
173
|
-
###
|
|
174
|
-
|
|
175
|
-
```
|
|
176
|
-
//
|
|
177
|
-
{
|
|
178
|
-
|
|
179
|
-
"
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
186
|
+
### Filter by Tags and Type
|
|
187
|
+
|
|
188
|
+
```javascript
|
|
189
|
+
// All upcoming GPU events
|
|
190
|
+
search_events({
|
|
191
|
+
tags: "gpu",
|
|
192
|
+
date: "upcoming",
|
|
193
|
+
limit: 20
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
// Beginner training sessions
|
|
197
|
+
search_events({
|
|
198
|
+
type: "training",
|
|
199
|
+
skill: "beginner",
|
|
200
|
+
date: "upcoming",
|
|
201
|
+
limit: 15
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
// Python workshops for beginners
|
|
205
|
+
search_events({
|
|
206
|
+
date: "this_month",
|
|
207
|
+
type: "workshop",
|
|
208
|
+
skill: "beginner",
|
|
209
|
+
tags: "python",
|
|
210
|
+
limit: 25
|
|
211
|
+
})
|
|
195
212
|
```
|
|
196
213
|
|
|
197
|
-
###
|
|
198
|
-
|
|
199
|
-
```
|
|
200
|
-
// Get
|
|
201
|
-
{
|
|
202
|
-
|
|
203
|
-
"
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
214
|
+
### Timezone-Aware Searches
|
|
215
|
+
|
|
216
|
+
```javascript
|
|
217
|
+
// Get events in New York timezone
|
|
218
|
+
search_events({
|
|
219
|
+
beginning_date_relative: "today",
|
|
220
|
+
end_date_relative: "+1week",
|
|
221
|
+
timezone: "America/New_York",
|
|
222
|
+
limit: 30
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
// Get events in Europe/London timezone
|
|
226
|
+
search_events({
|
|
227
|
+
query: "workshop",
|
|
228
|
+
beginning_date_relative: "today",
|
|
229
|
+
timezone: "Europe/London",
|
|
230
|
+
limit: 25
|
|
231
|
+
})
|
|
209
232
|
```
|
|
210
233
|
|
|
211
234
|
## Development
|
|
@@ -223,14 +246,15 @@ npm test
|
|
|
223
246
|
|
|
224
247
|
## Base URL
|
|
225
248
|
|
|
226
|
-
The server connects to: `https://support.access-ci.org/api/2.
|
|
249
|
+
The server connects to: `https://support.access-ci.org/api/2.2/events`
|
|
227
250
|
|
|
228
251
|
## Technical Notes
|
|
229
252
|
|
|
230
|
-
### API Version 2.
|
|
253
|
+
### API Version 2.2 Features
|
|
231
254
|
- **UTC timestamps**: All dates returned in UTC with Z suffix (e.g., `2024-08-30T13:00:00Z`)
|
|
232
255
|
- **Native search**: Uses `search_api_fulltext` parameter for comprehensive searching
|
|
233
256
|
- **Timezone support**: Relative dates calculated using specified timezone
|
|
257
|
+
- **Pagination**: API accepts specific page sizes (25, 50, 75, or 100). Requested limits are automatically rounded to nearest valid size.
|
|
234
258
|
- **Enhanced metadata**: Responses include API version and timezone info
|
|
235
259
|
|
|
236
260
|
### General
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
import { EventsServer } from "./server.js";
|
|
3
3
|
async function main() {
|
|
4
4
|
const server = new EventsServer();
|
|
5
|
-
|
|
5
|
+
const port = process.env.PORT ? parseInt(process.env.PORT, 10) : undefined;
|
|
6
|
+
await server.start(port ? { httpPort: port } : undefined);
|
|
6
7
|
}
|
|
7
8
|
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
8
9
|
main().catch((error) => {
|
package/dist/server.d.ts
CHANGED
|
@@ -4,100 +4,7 @@ export declare class EventsServer extends BaseAccessServer {
|
|
|
4
4
|
private _eventsHttpClient?;
|
|
5
5
|
constructor();
|
|
6
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
|
-
timezone: {
|
|
33
|
-
type: string;
|
|
34
|
-
description: string;
|
|
35
|
-
default: string;
|
|
36
|
-
};
|
|
37
|
-
event_type: {
|
|
38
|
-
type: string;
|
|
39
|
-
description: string;
|
|
40
|
-
};
|
|
41
|
-
event_affiliation: {
|
|
42
|
-
type: string;
|
|
43
|
-
description: string;
|
|
44
|
-
};
|
|
45
|
-
skill_level: {
|
|
46
|
-
type: string;
|
|
47
|
-
description: string;
|
|
48
|
-
enum: string[];
|
|
49
|
-
};
|
|
50
|
-
event_tags: {
|
|
51
|
-
type: string;
|
|
52
|
-
description: string;
|
|
53
|
-
};
|
|
54
|
-
limit: {
|
|
55
|
-
type: string;
|
|
56
|
-
description: string;
|
|
57
|
-
minimum: number;
|
|
58
|
-
maximum: number;
|
|
59
|
-
};
|
|
60
|
-
query?: undefined;
|
|
61
|
-
tag?: undefined;
|
|
62
|
-
time_range?: undefined;
|
|
63
|
-
};
|
|
64
|
-
required: never[];
|
|
65
|
-
};
|
|
66
|
-
} | {
|
|
67
|
-
name: string;
|
|
68
|
-
description: string;
|
|
69
|
-
inputSchema: {
|
|
70
|
-
type: string;
|
|
71
|
-
properties: {
|
|
72
|
-
limit: {
|
|
73
|
-
type: string;
|
|
74
|
-
description: string;
|
|
75
|
-
minimum: number;
|
|
76
|
-
maximum: number;
|
|
77
|
-
};
|
|
78
|
-
event_type: {
|
|
79
|
-
type: string;
|
|
80
|
-
description: string;
|
|
81
|
-
};
|
|
82
|
-
timezone: {
|
|
83
|
-
type: string;
|
|
84
|
-
description: string;
|
|
85
|
-
default: string;
|
|
86
|
-
};
|
|
87
|
-
beginning_date_relative?: undefined;
|
|
88
|
-
end_date_relative?: undefined;
|
|
89
|
-
beginning_date?: undefined;
|
|
90
|
-
end_date?: undefined;
|
|
91
|
-
event_affiliation?: undefined;
|
|
92
|
-
skill_level?: undefined;
|
|
93
|
-
event_tags?: undefined;
|
|
94
|
-
query?: undefined;
|
|
95
|
-
tag?: undefined;
|
|
96
|
-
time_range?: undefined;
|
|
97
|
-
};
|
|
98
|
-
required: never[];
|
|
99
|
-
};
|
|
100
|
-
} | {
|
|
7
|
+
protected getTools(): {
|
|
101
8
|
name: string;
|
|
102
9
|
description: string;
|
|
103
10
|
inputSchema: {
|
|
@@ -107,75 +14,32 @@ export declare class EventsServer extends BaseAccessServer {
|
|
|
107
14
|
type: string;
|
|
108
15
|
description: string;
|
|
109
16
|
};
|
|
110
|
-
|
|
111
|
-
type: string;
|
|
112
|
-
description: string;
|
|
113
|
-
default: string;
|
|
114
|
-
enum?: undefined;
|
|
115
|
-
};
|
|
116
|
-
timezone: {
|
|
117
|
-
type: string;
|
|
118
|
-
description: string;
|
|
119
|
-
default: string;
|
|
120
|
-
};
|
|
121
|
-
limit: {
|
|
17
|
+
type: {
|
|
122
18
|
type: string;
|
|
123
19
|
description: string;
|
|
124
|
-
minimum: number;
|
|
125
|
-
maximum: number;
|
|
126
20
|
};
|
|
127
|
-
|
|
128
|
-
beginning_date?: undefined;
|
|
129
|
-
end_date?: undefined;
|
|
130
|
-
event_type?: undefined;
|
|
131
|
-
event_affiliation?: undefined;
|
|
132
|
-
skill_level?: undefined;
|
|
133
|
-
event_tags?: undefined;
|
|
134
|
-
tag?: undefined;
|
|
135
|
-
time_range?: undefined;
|
|
136
|
-
};
|
|
137
|
-
required: string[];
|
|
138
|
-
};
|
|
139
|
-
} | {
|
|
140
|
-
name: string;
|
|
141
|
-
description: string;
|
|
142
|
-
inputSchema: {
|
|
143
|
-
type: string;
|
|
144
|
-
properties: {
|
|
145
|
-
tag: {
|
|
21
|
+
tags: {
|
|
146
22
|
type: string;
|
|
147
23
|
description: string;
|
|
148
24
|
};
|
|
149
|
-
|
|
25
|
+
date: {
|
|
150
26
|
type: string;
|
|
151
27
|
description: string;
|
|
152
28
|
enum: string[];
|
|
153
|
-
default: string;
|
|
154
29
|
};
|
|
155
|
-
|
|
30
|
+
skill: {
|
|
156
31
|
type: string;
|
|
157
32
|
description: string;
|
|
158
|
-
|
|
33
|
+
enum: string[];
|
|
159
34
|
};
|
|
160
35
|
limit: {
|
|
161
36
|
type: string;
|
|
162
37
|
description: string;
|
|
163
|
-
|
|
164
|
-
maximum: number;
|
|
38
|
+
default: number;
|
|
165
39
|
};
|
|
166
|
-
beginning_date_relative?: undefined;
|
|
167
|
-
end_date_relative?: undefined;
|
|
168
|
-
beginning_date?: undefined;
|
|
169
|
-
end_date?: undefined;
|
|
170
|
-
event_type?: undefined;
|
|
171
|
-
event_affiliation?: undefined;
|
|
172
|
-
skill_level?: undefined;
|
|
173
|
-
event_tags?: undefined;
|
|
174
|
-
query?: undefined;
|
|
175
40
|
};
|
|
176
|
-
required: string[];
|
|
177
41
|
};
|
|
178
|
-
}
|
|
42
|
+
}[];
|
|
179
43
|
protected getResources(): {
|
|
180
44
|
uri: string;
|
|
181
45
|
name: string;
|
|
@@ -190,15 +54,12 @@ export declare class EventsServer extends BaseAccessServer {
|
|
|
190
54
|
}>;
|
|
191
55
|
handleResourceRead(request: any): Promise<{
|
|
192
56
|
contents: {
|
|
193
|
-
uri:
|
|
57
|
+
uri: string;
|
|
194
58
|
mimeType: string;
|
|
195
59
|
text: string;
|
|
196
60
|
}[];
|
|
197
61
|
}>;
|
|
198
62
|
private buildEventsUrl;
|
|
199
63
|
private getEvents;
|
|
200
|
-
private getUpcomingEvents;
|
|
201
64
|
private searchEvents;
|
|
202
|
-
private getEventsByTag;
|
|
203
|
-
private getPopularTags;
|
|
204
65
|
}
|