@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 +199 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +12 -0
- package/dist/server.d.ts +184 -0
- package/dist/server.js +464 -0
- package/package.json +47 -0
- package/src/__tests__/server.integration.test.ts +219 -0
- package/src/__tests__/server.test.ts +643 -0
- package/src/index.ts +15 -0
- package/src/server.ts +546 -0
- package/tsconfig.json +10 -0
- package/vitest.config.ts +18 -0
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
|
package/dist/index.d.ts
ADDED
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
|
+
}
|
package/dist/server.d.ts
ADDED
|
@@ -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
|
+
}
|