@heyseo/mcp-server 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 +284 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +258 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +22 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +267 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/index.d.ts +38 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +247 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/tools/comparison.d.ts +159 -0
- package/dist/tools/comparison.d.ts.map +1 -0
- package/dist/tools/comparison.js +482 -0
- package/dist/tools/comparison.js.map +1 -0
- package/dist/tools/ga4.d.ts +182 -0
- package/dist/tools/ga4.d.ts.map +1 -0
- package/dist/tools/ga4.js +429 -0
- package/dist/tools/ga4.js.map +1 -0
- package/dist/tools/gsc.d.ts +194 -0
- package/dist/tools/gsc.d.ts.map +1 -0
- package/dist/tools/gsc.js +348 -0
- package/dist/tools/gsc.js.map +1 -0
- package/dist/tools/index.d.ts +392 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +59 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/pagespeed.d.ts +88 -0
- package/dist/tools/pagespeed.d.ts.map +1 -0
- package/dist/tools/pagespeed.js +285 -0
- package/dist/tools/pagespeed.js.map +1 -0
- package/dist/tools/tasks.d.ts +71 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +116 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/types.d.ts +151 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/api-client.d.ts +69 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +202 -0
- package/dist/utils/api-client.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# HeySeo MCP Server
|
|
2
|
+
|
|
3
|
+
Connect your LLM to your SEO data. Query Google Search Console, Google Analytics 4, and PageSpeed Insights directly from Claude, Cursor, or any MCP-compatible client.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
### Tools
|
|
8
|
+
|
|
9
|
+
| Tool | Description |
|
|
10
|
+
|------|-------------|
|
|
11
|
+
| `heyseo_query_gsc` | Query Google Search Console analytics with custom dimensions and filters |
|
|
12
|
+
| `heyseo_top_keywords` | Get top performing keywords for a site |
|
|
13
|
+
| `heyseo_top_pages` | Get top performing pages for a site |
|
|
14
|
+
| `heyseo_query_ga4` | Query Google Analytics 4 data |
|
|
15
|
+
| `heyseo_landing_pages` | Get landing page performance with engagement metrics |
|
|
16
|
+
| `heyseo_traffic_sources` | Analyze traffic sources and channels |
|
|
17
|
+
| `heyseo_pagespeed` | Run PageSpeed Insights analysis with Core Web Vitals |
|
|
18
|
+
| `heyseo_pagespeed_bulk` | Analyze multiple pages at once |
|
|
19
|
+
| `heyseo_compare_periods` | Compare SEO metrics between two time periods |
|
|
20
|
+
| `heyseo_week_over_week` | Quick week-over-week comparison |
|
|
21
|
+
| `heyseo_find_opportunities` | Discover SEO optimization opportunities |
|
|
22
|
+
| `heyseo_create_task` | Create SEO tasks in HeySeo Kanban |
|
|
23
|
+
|
|
24
|
+
### Resources
|
|
25
|
+
|
|
26
|
+
Access your SEO data as readable resources:
|
|
27
|
+
|
|
28
|
+
- `heyseo://sites` - List all connected sites
|
|
29
|
+
- `heyseo://sites/{id}` - Site details
|
|
30
|
+
- `heyseo://sites/{id}/overview` - Current metrics overview
|
|
31
|
+
- `heyseo://sites/{id}/keywords` - Top 50 keywords
|
|
32
|
+
- `heyseo://sites/{id}/pages` - Top 50 pages
|
|
33
|
+
|
|
34
|
+
### Prompts
|
|
35
|
+
|
|
36
|
+
Pre-built prompts for common SEO tasks:
|
|
37
|
+
|
|
38
|
+
- `seo_audit` - Comprehensive SEO audit
|
|
39
|
+
- `weekly_report` - Weekly performance report
|
|
40
|
+
- `keyword_research` - Keyword analysis and opportunities
|
|
41
|
+
- `content_optimization` - Page optimization recommendations
|
|
42
|
+
- `technical_health_check` - Core Web Vitals and performance
|
|
43
|
+
- `traffic_analysis` - Traffic patterns and sources
|
|
44
|
+
- `quick_wins` - Low-effort, high-impact opportunities
|
|
45
|
+
- `ranking_changes` - Recent ranking changes analysis
|
|
46
|
+
|
|
47
|
+
## Installation
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
npm install @heyseo/mcp-server
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Or clone and build from source:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
git clone https://github.com/heyseo/mcp-server
|
|
57
|
+
cd mcp-server
|
|
58
|
+
npm install
|
|
59
|
+
npm run build
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Configuration
|
|
63
|
+
|
|
64
|
+
### Environment Variables
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# Required: Your HeySeo API key
|
|
68
|
+
HEYSEO_API_KEY=your_api_key_here
|
|
69
|
+
|
|
70
|
+
# Optional: Custom API URL (defaults to https://heyseo.app)
|
|
71
|
+
HEYSEO_API_URL=https://heyseo.app
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Claude Desktop Configuration
|
|
75
|
+
|
|
76
|
+
Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"mcpServers": {
|
|
81
|
+
"heyseo": {
|
|
82
|
+
"command": "npx",
|
|
83
|
+
"args": ["@heyseo/mcp-server"],
|
|
84
|
+
"env": {
|
|
85
|
+
"HEYSEO_API_KEY": "your_api_key_here"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Or if installed locally:
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"mcpServers": {
|
|
97
|
+
"heyseo": {
|
|
98
|
+
"command": "node",
|
|
99
|
+
"args": ["/path/to/mcp-server/dist/index.js"],
|
|
100
|
+
"env": {
|
|
101
|
+
"HEYSEO_API_KEY": "your_api_key_here"
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Cursor Configuration
|
|
109
|
+
|
|
110
|
+
Add to your Cursor settings:
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"mcp.servers": {
|
|
115
|
+
"heyseo": {
|
|
116
|
+
"command": "npx",
|
|
117
|
+
"args": ["@heyseo/mcp-server"],
|
|
118
|
+
"env": {
|
|
119
|
+
"HEYSEO_API_KEY": "your_api_key_here"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Usage Examples
|
|
127
|
+
|
|
128
|
+
### Query Top Keywords
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
User: What are my top 10 keywords this month?
|
|
132
|
+
|
|
133
|
+
Claude: I'll query your top keywords using HeySeo.
|
|
134
|
+
[Calls heyseo_top_keywords with limit=10]
|
|
135
|
+
|
|
136
|
+
Here are your top 10 keywords for the last 28 days:
|
|
137
|
+
|
|
138
|
+
| Rank | Keyword | Clicks | Impressions | CTR | Position |
|
|
139
|
+
|------|---------|--------|-------------|-----|----------|
|
|
140
|
+
| 1 | seo tools | 1,234 | 45,000 | 2.7% | 4.2 |
|
|
141
|
+
| 2 | keyword research | 890 | 32,000 | 2.8% | 5.1 |
|
|
142
|
+
...
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Run SEO Audit
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
User: Run an SEO audit on my site
|
|
149
|
+
|
|
150
|
+
Claude: I'll perform a comprehensive SEO audit.
|
|
151
|
+
[Uses seo_audit prompt template]
|
|
152
|
+
[Calls multiple tools: top_keywords, top_pages, find_opportunities]
|
|
153
|
+
|
|
154
|
+
## SEO Audit Report
|
|
155
|
+
|
|
156
|
+
### Performance Overview
|
|
157
|
+
- Total Clicks: 15,234 (+12% MoM)
|
|
158
|
+
- Impressions: 456,000 (+8% MoM)
|
|
159
|
+
- Average CTR: 3.3%
|
|
160
|
+
- Average Position: 12.4
|
|
161
|
+
|
|
162
|
+
### Key Findings
|
|
163
|
+
1. **Quick Wins Found**: 23 keywords with high impressions but low CTR
|
|
164
|
+
2. **Page 2 Opportunities**: 15 keywords ranking positions 11-20
|
|
165
|
+
3. **Underperforming Pages**: 5 pages with >1000 impressions but <2% CTR
|
|
166
|
+
|
|
167
|
+
### Recommendations
|
|
168
|
+
1. [HIGH] Optimize meta descriptions for top 10 low-CTR pages
|
|
169
|
+
2. [MEDIUM] Expand content on page 2 keywords
|
|
170
|
+
3. [LOW] Add FAQ schema to product pages
|
|
171
|
+
|
|
172
|
+
Creating tasks for top recommendations...
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Compare Performance
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
User: How did we do this week vs last week?
|
|
179
|
+
|
|
180
|
+
Claude: I'll compare your week-over-week performance.
|
|
181
|
+
[Calls heyseo_week_over_week]
|
|
182
|
+
|
|
183
|
+
## Week-over-Week Comparison
|
|
184
|
+
|
|
185
|
+
| Metric | Last Week | This Week | Change |
|
|
186
|
+
|--------|-----------|-----------|--------|
|
|
187
|
+
| Clicks | 3,456 | 3,890 | +12.6% |
|
|
188
|
+
| Impressions | 98,000 | 105,000 | +7.1% |
|
|
189
|
+
| CTR | 3.5% | 3.7% | +0.2pp |
|
|
190
|
+
| Position | 11.2 | 10.8 | -0.4 (improved) |
|
|
191
|
+
|
|
192
|
+
**Top Gainers:**
|
|
193
|
+
- "best seo tool" +45 clicks (+32%)
|
|
194
|
+
- "keyword tracker" +28 clicks (+18%)
|
|
195
|
+
|
|
196
|
+
**Top Losers:**
|
|
197
|
+
- "seo software" -12 clicks (-8%)
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Analyze Page Speed
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
User: Check the page speed for our homepage
|
|
204
|
+
|
|
205
|
+
Claude: I'll analyze your homepage performance.
|
|
206
|
+
[Calls heyseo_pagespeed with url and strategy=mobile]
|
|
207
|
+
|
|
208
|
+
## PageSpeed Analysis: https://example.com
|
|
209
|
+
|
|
210
|
+
**Performance Score: 72/100** (Needs Improvement)
|
|
211
|
+
|
|
212
|
+
### Core Web Vitals
|
|
213
|
+
| Metric | Value | Rating |
|
|
214
|
+
|--------|-------|--------|
|
|
215
|
+
| LCP | 2.8s | Needs Improvement |
|
|
216
|
+
| INP | 120ms | Good |
|
|
217
|
+
| CLS | 0.05 | Good |
|
|
218
|
+
| FCP | 1.2s | Good |
|
|
219
|
+
| TTFB | 0.8s | Good |
|
|
220
|
+
|
|
221
|
+
### Top Opportunities
|
|
222
|
+
1. **Serve images in next-gen formats** - Save 1.2s
|
|
223
|
+
2. **Eliminate render-blocking resources** - Save 0.8s
|
|
224
|
+
3. **Reduce unused JavaScript** - Save 0.4s
|
|
225
|
+
|
|
226
|
+
Would you like me to create tasks for these optimizations?
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## API Reference
|
|
230
|
+
|
|
231
|
+
### Getting an API Key
|
|
232
|
+
|
|
233
|
+
1. Sign up at [heyseo.app](https://heyseo.app)
|
|
234
|
+
2. Connect your Google Search Console and/or GA4 properties
|
|
235
|
+
3. Generate an API key in Settings > API
|
|
236
|
+
|
|
237
|
+
### Rate Limits
|
|
238
|
+
|
|
239
|
+
- 100 requests per minute per API key
|
|
240
|
+
- 10,000 requests per day per API key
|
|
241
|
+
|
|
242
|
+
### Error Handling
|
|
243
|
+
|
|
244
|
+
All tools return JSON with a `success` field:
|
|
245
|
+
|
|
246
|
+
```json
|
|
247
|
+
// Success
|
|
248
|
+
{
|
|
249
|
+
"success": true,
|
|
250
|
+
"data": { ... }
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Error
|
|
254
|
+
{
|
|
255
|
+
"success": false,
|
|
256
|
+
"error": "Error message here"
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Development
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
# Install dependencies
|
|
264
|
+
npm install
|
|
265
|
+
|
|
266
|
+
# Build
|
|
267
|
+
npm run build
|
|
268
|
+
|
|
269
|
+
# Run in development mode
|
|
270
|
+
npm run dev
|
|
271
|
+
|
|
272
|
+
# Test locally
|
|
273
|
+
HEYSEO_API_KEY=your_key node dist/index.js
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## License
|
|
277
|
+
|
|
278
|
+
MIT
|
|
279
|
+
|
|
280
|
+
## Support
|
|
281
|
+
|
|
282
|
+
- Documentation: [docs.heyseo.app](https://docs.heyseo.app)
|
|
283
|
+
- Issues: [GitHub Issues](https://github.com/heyseo/mcp-server/issues)
|
|
284
|
+
- Discord: [HeySeo Community](https://discord.gg/heyseo)
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;GAMG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* HeySeo MCP Server
|
|
4
|
+
* Model Context Protocol server for connecting LLMs to HeySeo SEO data
|
|
5
|
+
*
|
|
6
|
+
* @author HeySeo
|
|
7
|
+
* @license MIT
|
|
8
|
+
*/
|
|
9
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
10
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
11
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, ErrorCode, McpError, } from '@modelcontextprotocol/sdk/types.js';
|
|
12
|
+
import { createApiClient } from './utils/api-client.js';
|
|
13
|
+
import { allTools, executeQueryGSC, executeTopKeywords, executeTopPages, executeQueryGA4, executeLandingPages, executeTrafficSources, executeAnalyzePageSpeed, executeBulkPageSpeed, executeComparePeriod, executeWeekOverWeek, executeFindOpportunities, executeCreateTask, queryGSCSchema, topKeywordsSchema, topPagesSchema, queryGA4Schema, landingPagesSchema, trafficSourcesSchema, analyzePageSpeedSchema, bulkPageSpeedSchema, comparePeriodSchema, weekOverWeekSchema, findOpportunitiesSchema, createTaskSchema, } from './tools/index.js';
|
|
14
|
+
import { listResources, fetchResource, resourceTemplates } from './resources/index.js';
|
|
15
|
+
import { promptTemplates, generatePromptMessages } from './prompts/index.js';
|
|
16
|
+
// Server info
|
|
17
|
+
const SERVER_NAME = 'heyseo-mcp';
|
|
18
|
+
const SERVER_VERSION = '0.1.0';
|
|
19
|
+
/**
|
|
20
|
+
* Main MCP Server class
|
|
21
|
+
*/
|
|
22
|
+
class HeySeoMCPServer {
|
|
23
|
+
server;
|
|
24
|
+
client = null;
|
|
25
|
+
constructor() {
|
|
26
|
+
this.server = new Server({
|
|
27
|
+
name: SERVER_NAME,
|
|
28
|
+
version: SERVER_VERSION,
|
|
29
|
+
}, {
|
|
30
|
+
capabilities: {
|
|
31
|
+
tools: {},
|
|
32
|
+
resources: {},
|
|
33
|
+
prompts: {},
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
this.setupHandlers();
|
|
37
|
+
this.setupErrorHandling();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Initialize the API client
|
|
41
|
+
*/
|
|
42
|
+
initClient() {
|
|
43
|
+
if (!this.client) {
|
|
44
|
+
this.client = createApiClient();
|
|
45
|
+
}
|
|
46
|
+
return this.client;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Setup request handlers
|
|
50
|
+
*/
|
|
51
|
+
setupHandlers() {
|
|
52
|
+
// List available tools
|
|
53
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
54
|
+
return {
|
|
55
|
+
tools: allTools,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
// Handle tool calls
|
|
59
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
60
|
+
const { name, arguments: args } = request.params;
|
|
61
|
+
const client = this.initClient();
|
|
62
|
+
try {
|
|
63
|
+
let result;
|
|
64
|
+
switch (name) {
|
|
65
|
+
// GSC Tools
|
|
66
|
+
case 'heyseo_query_gsc': {
|
|
67
|
+
const parsed = queryGSCSchema.parse(args);
|
|
68
|
+
result = await executeQueryGSC(client, parsed);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case 'heyseo_top_keywords': {
|
|
72
|
+
const parsed = topKeywordsSchema.parse(args);
|
|
73
|
+
result = await executeTopKeywords(client, parsed);
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
case 'heyseo_top_pages': {
|
|
77
|
+
const parsed = topPagesSchema.parse(args);
|
|
78
|
+
result = await executeTopPages(client, parsed);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
// GA4 Tools
|
|
82
|
+
case 'heyseo_query_ga4': {
|
|
83
|
+
const parsed = queryGA4Schema.parse(args);
|
|
84
|
+
result = await executeQueryGA4(client, parsed);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
case 'heyseo_landing_pages': {
|
|
88
|
+
const parsed = landingPagesSchema.parse(args);
|
|
89
|
+
result = await executeLandingPages(client, parsed);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
case 'heyseo_traffic_sources': {
|
|
93
|
+
const parsed = trafficSourcesSchema.parse(args);
|
|
94
|
+
result = await executeTrafficSources(client, parsed);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
// PageSpeed Tools
|
|
98
|
+
case 'heyseo_pagespeed': {
|
|
99
|
+
const parsed = analyzePageSpeedSchema.parse(args);
|
|
100
|
+
result = await executeAnalyzePageSpeed(client, parsed);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case 'heyseo_pagespeed_bulk': {
|
|
104
|
+
const parsed = bulkPageSpeedSchema.parse(args);
|
|
105
|
+
result = await executeBulkPageSpeed(client, parsed);
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
// Comparison Tools
|
|
109
|
+
case 'heyseo_compare_periods': {
|
|
110
|
+
const parsed = comparePeriodSchema.parse(args);
|
|
111
|
+
result = await executeComparePeriod(client, parsed);
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
case 'heyseo_week_over_week': {
|
|
115
|
+
const parsed = weekOverWeekSchema.parse(args);
|
|
116
|
+
result = await executeWeekOverWeek(client, parsed);
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case 'heyseo_find_opportunities': {
|
|
120
|
+
const parsed = findOpportunitiesSchema.parse(args);
|
|
121
|
+
result = await executeFindOpportunities(client, parsed);
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
// Task Tools
|
|
125
|
+
case 'heyseo_create_task': {
|
|
126
|
+
const parsed = createTaskSchema.parse(args);
|
|
127
|
+
result = await executeCreateTask(client, parsed);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
default:
|
|
131
|
+
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
content: [
|
|
135
|
+
{
|
|
136
|
+
type: 'text',
|
|
137
|
+
text: result,
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (error instanceof McpError) {
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
147
|
+
return {
|
|
148
|
+
content: [
|
|
149
|
+
{
|
|
150
|
+
type: 'text',
|
|
151
|
+
text: JSON.stringify({ success: false, error: errorMessage }),
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
isError: true,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
// List available resources
|
|
159
|
+
this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
160
|
+
try {
|
|
161
|
+
const client = this.initClient();
|
|
162
|
+
const resources = await listResources(client);
|
|
163
|
+
return { resources };
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Return resource templates if we can't fetch actual resources
|
|
167
|
+
return {
|
|
168
|
+
resources: resourceTemplates.map((t) => ({
|
|
169
|
+
uri: t.uriTemplate,
|
|
170
|
+
name: t.name,
|
|
171
|
+
description: t.description,
|
|
172
|
+
mimeType: t.mimeType,
|
|
173
|
+
})),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
// Read resource content
|
|
178
|
+
this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
179
|
+
const { uri } = request.params;
|
|
180
|
+
const client = this.initClient();
|
|
181
|
+
try {
|
|
182
|
+
const { content, mimeType } = await fetchResource(client, uri);
|
|
183
|
+
return {
|
|
184
|
+
contents: [
|
|
185
|
+
{
|
|
186
|
+
uri,
|
|
187
|
+
mimeType,
|
|
188
|
+
text: content,
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
throw new McpError(ErrorCode.InvalidRequest, error instanceof Error ? error.message : 'Failed to read resource');
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
// List available prompts
|
|
198
|
+
this.server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
199
|
+
return {
|
|
200
|
+
prompts: promptTemplates.map((p) => ({
|
|
201
|
+
name: p.name,
|
|
202
|
+
description: p.description,
|
|
203
|
+
arguments: p.arguments,
|
|
204
|
+
})),
|
|
205
|
+
};
|
|
206
|
+
});
|
|
207
|
+
// Get prompt content
|
|
208
|
+
this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
209
|
+
const { name, arguments: args } = request.params;
|
|
210
|
+
const template = promptTemplates.find((p) => p.name === name);
|
|
211
|
+
if (!template) {
|
|
212
|
+
throw new McpError(ErrorCode.InvalidRequest, `Unknown prompt: ${name}`);
|
|
213
|
+
}
|
|
214
|
+
// Validate required arguments
|
|
215
|
+
for (const arg of template.arguments) {
|
|
216
|
+
if (arg.required && (!args || !args[arg.name])) {
|
|
217
|
+
throw new McpError(ErrorCode.InvalidParams, `Missing required argument: ${arg.name}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const messages = generatePromptMessages(name, args || {});
|
|
221
|
+
return {
|
|
222
|
+
description: template.description,
|
|
223
|
+
messages,
|
|
224
|
+
};
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Setup error handling
|
|
229
|
+
*/
|
|
230
|
+
setupErrorHandling() {
|
|
231
|
+
this.server.onerror = (error) => {
|
|
232
|
+
console.error('[HeySeo MCP Error]', error);
|
|
233
|
+
};
|
|
234
|
+
process.on('SIGINT', async () => {
|
|
235
|
+
await this.server.close();
|
|
236
|
+
process.exit(0);
|
|
237
|
+
});
|
|
238
|
+
process.on('SIGTERM', async () => {
|
|
239
|
+
await this.server.close();
|
|
240
|
+
process.exit(0);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Run the server
|
|
245
|
+
*/
|
|
246
|
+
async run() {
|
|
247
|
+
const transport = new StdioServerTransport();
|
|
248
|
+
await this.server.connect(transport);
|
|
249
|
+
console.error(`HeySeo MCP Server v${SERVER_VERSION} running on stdio`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Main entry point
|
|
253
|
+
const server = new HeySeoMCPServer();
|
|
254
|
+
server.run().catch((error) => {
|
|
255
|
+
console.error('Failed to start HeySeo MCP Server:', error);
|
|
256
|
+
process.exit(1);
|
|
257
|
+
});
|
|
258
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Prompt Templates
|
|
3
|
+
* Pre-built prompts for common SEO analysis tasks
|
|
4
|
+
*/
|
|
5
|
+
export interface PromptTemplate {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
arguments: Array<{
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
required: boolean;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export declare const promptTemplates: PromptTemplate[];
|
|
15
|
+
/**
|
|
16
|
+
* Generate prompt messages for a template
|
|
17
|
+
*/
|
|
18
|
+
export declare function generatePromptMessages(templateName: string, args: Record<string, string>): Array<{
|
|
19
|
+
role: 'user';
|
|
20
|
+
content: string;
|
|
21
|
+
}>;
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;CACJ;AAED,eAAO,MAAM,eAAe,EAAE,cAAc,EA2H3C,CAAC;AAEF;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAuJ1C"}
|