@disruptorganic/mcp-google-search-console 1.1.0 → 2.0.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/.env.example +70 -112
- package/README.md +0 -0
- package/dist/auth/account-lock.d.ts +26 -0
- package/dist/auth/account-lock.d.ts.map +1 -0
- package/dist/auth/account-lock.js +72 -0
- package/dist/auth/account-lock.js.map +1 -0
- package/dist/auth/token-validator.d.ts +18 -0
- package/dist/auth/token-validator.d.ts.map +1 -0
- package/dist/auth/token-validator.js +175 -0
- package/dist/auth/token-validator.js.map +1 -0
- package/dist/config/index.d.ts +14 -27
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +86 -57
- package/dist/config/index.js.map +1 -1
- package/dist/index.js +119 -106
- package/dist/index.js.map +1 -1
- package/dist/server/http.d.ts +36 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +394 -0
- package/dist/server/http.js.map +1 -0
- package/dist/tools/compare-date-ranges.d.ts +1 -1
- package/dist/tools/compare-date-ranges.d.ts.map +1 -1
- package/dist/tools/compare-date-ranges.js +14 -1
- package/dist/tools/compare-date-ranges.js.map +1 -1
- package/dist/tools/get-property-info.d.ts +1 -1
- package/dist/tools/get-property-info.d.ts.map +1 -1
- package/dist/tools/get-property-info.js +14 -1
- package/dist/tools/get-property-info.js.map +1 -1
- package/dist/tools/get-top-pages.d.ts +1 -1
- package/dist/tools/get-top-pages.d.ts.map +1 -1
- package/dist/tools/get-top-pages.js +14 -1
- package/dist/tools/get-top-pages.js.map +1 -1
- package/dist/tools/get-top-queries.d.ts +1 -1
- package/dist/tools/get-top-queries.d.ts.map +1 -1
- package/dist/tools/get-top-queries.js +14 -1
- package/dist/tools/get-top-queries.js.map +1 -1
- package/dist/tools/health-check.d.ts +1 -1
- package/dist/tools/health-check.d.ts.map +1 -1
- package/dist/tools/health-check.js +24 -19
- package/dist/tools/health-check.js.map +1 -1
- package/dist/tools/index.d.ts +2 -77
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +0 -10
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-properties.d.ts +1 -1
- package/dist/tools/list-properties.d.ts.map +1 -1
- package/dist/tools/list-properties.js +14 -1
- package/dist/tools/list-properties.js.map +1 -1
- package/dist/tools/query-advanced.d.ts +1 -1
- package/dist/tools/query-advanced.d.ts.map +1 -1
- package/dist/tools/query-advanced.js +14 -1
- package/dist/tools/query-advanced.js.map +1 -1
- package/dist/tools/query-by-keyword.d.ts +1 -1
- package/dist/tools/query-by-keyword.d.ts.map +1 -1
- package/dist/tools/query-by-keyword.js +14 -1
- package/dist/tools/query-by-keyword.js.map +1 -1
- package/dist/tools/query-by-url.d.ts +1 -1
- package/dist/tools/query-by-url.d.ts.map +1 -1
- package/dist/tools/query-by-url.js +14 -1
- package/dist/tools/query-by-url.js.map +1 -1
- package/package.json +18 -7
- package/dist/tools/auth.d.ts +0 -95
- package/dist/tools/auth.d.ts.map +0 -1
- package/dist/tools/auth.js +0 -317
- package/dist/tools/auth.js.map +0 -1
package/dist/config/index.js
CHANGED
|
@@ -1,82 +1,111 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
1
|
import * as path from 'path';
|
|
3
2
|
import * as os from 'os';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
});
|
|
13
|
-
function loadConfig() {
|
|
14
|
-
const rawConfig = {
|
|
15
|
-
clientId: EMBEDDED_CLIENT_ID,
|
|
16
|
-
clientSecret: EMBEDDED_CLIENT_SECRET,
|
|
17
|
-
tokenPath: process.env.GSC_TOKEN_PATH,
|
|
18
|
-
redirectUri: process.env.GSC_REDIRECT_URI,
|
|
19
|
-
logLevel: process.env.LOG_LEVEL,
|
|
20
|
-
};
|
|
21
|
-
try {
|
|
22
|
-
return configSchema.parse(rawConfig);
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
function validateRequiredEnvVars() {
|
|
5
|
+
const required = ['GOOGLE_CLIENT_ID', 'GOOGLE_CLIENT_SECRET'];
|
|
6
|
+
const missing = [];
|
|
7
|
+
for (const varName of required) {
|
|
8
|
+
if (!process.env[varName]) {
|
|
9
|
+
missing.push(varName);
|
|
10
|
+
}
|
|
23
11
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return ` - ${field}: ${issue.message}`;
|
|
30
|
-
})
|
|
31
|
-
.join('\n');
|
|
32
|
-
const errorMessage = `
|
|
33
|
-
Configuration Error: Invalid configuration
|
|
12
|
+
if (missing.length > 0) {
|
|
13
|
+
const errorMessage = `
|
|
14
|
+
╔════════════════════════════════════════════════════════════════╗
|
|
15
|
+
║ CONFIGURATION ERROR: Missing Required Environment Variables ║
|
|
16
|
+
╚════════════════════════════════════════════════════════════════╝
|
|
34
17
|
|
|
35
|
-
|
|
18
|
+
The following required environment variables are not set:
|
|
19
|
+
${missing.map(v => ` - ${v}`).join('\n')}
|
|
36
20
|
|
|
37
|
-
|
|
38
|
-
No setup required for authentication credentials.
|
|
21
|
+
To fix this:
|
|
39
22
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
23
|
+
1. Create a .env file in the project root
|
|
24
|
+
2. Copy .env.example to .env: cp .env.example .env
|
|
25
|
+
3. Add your Google OAuth credentials:
|
|
26
|
+
- Get them from: https://console.cloud.google.com
|
|
27
|
+
- See docs/GOOGLE_OAUTH_SETUP.md for instructions
|
|
44
28
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
29
|
+
Example .env file:
|
|
30
|
+
GOOGLE_CLIENT_ID=123456789-abc...apps.googleusercontent.com
|
|
31
|
+
GOOGLE_CLIENT_SECRET=GOCSPX-abc...xyz
|
|
32
|
+
|
|
33
|
+
Then restart the server.
|
|
34
|
+
`.trim();
|
|
35
|
+
logger.error(errorMessage);
|
|
36
|
+
throw new Error('Missing required environment variables');
|
|
50
37
|
}
|
|
51
38
|
}
|
|
39
|
+
function loadConfig() {
|
|
40
|
+
validateRequiredEnvVars();
|
|
41
|
+
const nodeEnv = process.env.NODE_ENV || 'production';
|
|
42
|
+
return {
|
|
43
|
+
clientId: process.env.GOOGLE_CLIENT_ID,
|
|
44
|
+
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
|
45
|
+
redirectUri: process.env.GOOGLE_REDIRECT_URI ||
|
|
46
|
+
'http://localhost:3456/oauth/callback',
|
|
47
|
+
port: parseInt(process.env.MCP_PORT || '3456', 10),
|
|
48
|
+
host: process.env.MCP_HOST || 'localhost',
|
|
49
|
+
logLevel: process.env.LOG_LEVEL || 'info',
|
|
50
|
+
tokenPath: process.env.GSC_TOKEN_PATH ||
|
|
51
|
+
path.join(os.homedir(), '.config/gsc-mcp/tokens.json'),
|
|
52
|
+
rateLimitQPM: parseInt(process.env.GSC_RATE_LIMIT_QPM || '1200', 10),
|
|
53
|
+
tokenValidationCacheTTL: parseInt(process.env.TOKEN_VALIDATION_CACHE_TTL || '300', 10),
|
|
54
|
+
propertyCacheTTL: parseInt(process.env.PROPERTY_CACHE_TTL || '86400', 10),
|
|
55
|
+
nodeEnv,
|
|
56
|
+
isDevelopment: nodeEnv === 'development',
|
|
57
|
+
isProduction: nodeEnv === 'production',
|
|
58
|
+
};
|
|
59
|
+
}
|
|
52
60
|
export const config = loadConfig();
|
|
61
|
+
export function getEnvironment() {
|
|
62
|
+
return config.nodeEnv;
|
|
63
|
+
}
|
|
53
64
|
export function getTokenDirectory() {
|
|
54
65
|
return path.dirname(config.tokenPath);
|
|
55
66
|
}
|
|
56
67
|
export function isDevelopment() {
|
|
57
|
-
return
|
|
68
|
+
return config.isDevelopment;
|
|
58
69
|
}
|
|
59
70
|
export function isProduction() {
|
|
60
|
-
return
|
|
71
|
+
return config.isProduction;
|
|
61
72
|
}
|
|
62
|
-
export function
|
|
63
|
-
|
|
73
|
+
export function logConfiguration() {
|
|
74
|
+
logger.info('Configuration loaded', {
|
|
75
|
+
server: {
|
|
76
|
+
port: config.port,
|
|
77
|
+
host: config.host,
|
|
78
|
+
nodeEnv: config.nodeEnv,
|
|
79
|
+
},
|
|
80
|
+
oauth: {
|
|
81
|
+
clientId: config.clientId.substring(0, 20) + '...',
|
|
82
|
+
redirectUri: config.redirectUri,
|
|
83
|
+
},
|
|
84
|
+
caching: {
|
|
85
|
+
tokenValidationCacheTTL: config.tokenValidationCacheTTL,
|
|
86
|
+
propertyCacheTTL: config.propertyCacheTTL,
|
|
87
|
+
},
|
|
88
|
+
rateLimiting: {
|
|
89
|
+
qpm: config.rateLimitQPM,
|
|
90
|
+
},
|
|
91
|
+
logging: {
|
|
92
|
+
level: config.logLevel,
|
|
93
|
+
},
|
|
94
|
+
});
|
|
64
95
|
}
|
|
65
96
|
export function getConfigSummary() {
|
|
66
97
|
return {
|
|
67
|
-
clientId: config.clientId.substring(0,
|
|
68
|
-
clientSecret: '***',
|
|
69
|
-
tokenPath: config.tokenPath,
|
|
98
|
+
clientId: config.clientId.substring(0, 20) + '...',
|
|
99
|
+
clientSecret: '***REDACTED***',
|
|
70
100
|
redirectUri: config.redirectUri,
|
|
101
|
+
tokenPath: config.tokenPath,
|
|
102
|
+
port: config.port.toString(),
|
|
103
|
+
host: config.host,
|
|
71
104
|
logLevel: config.logLevel,
|
|
72
|
-
environment:
|
|
105
|
+
environment: config.nodeEnv,
|
|
106
|
+
rateLimitQPM: config.rateLimitQPM.toString(),
|
|
107
|
+
tokenValidationCacheTTL: config.tokenValidationCacheTTL.toString(),
|
|
108
|
+
propertyCacheTTL: config.propertyCacheTTL.toString(),
|
|
73
109
|
};
|
|
74
110
|
}
|
|
75
|
-
export function logConfigSummary() {
|
|
76
|
-
console.log('Configuration loaded successfully:');
|
|
77
|
-
const summary = getConfigSummary();
|
|
78
|
-
Object.entries(summary).forEach(([key, value]) => {
|
|
79
|
-
console.log(` ${key}: ${value}`);
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
111
|
//# sourceMappingURL=index.js.map
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAeA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
3
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
-
import {
|
|
4
|
+
import { OAuth2Client } from 'google-auth-library';
|
|
6
5
|
import { GSCClient } from './gsc/client.js';
|
|
7
|
-
import { allTools, toolHandlers, getToolStats
|
|
6
|
+
import { allTools, toolHandlers, getToolStats } from './tools/index.js';
|
|
8
7
|
import { logger } from './utils/logger.js';
|
|
9
|
-
import { getEnvironment } from './config/index.js';
|
|
10
|
-
|
|
8
|
+
import { config, logConfiguration, getEnvironment } from './config/index.js';
|
|
9
|
+
import { createHttpServer } from './server/http.js';
|
|
10
|
+
const SERVER_VERSION = '2.0.0';
|
|
11
11
|
const SERVER_NAME = 'google-search-console-mcp';
|
|
12
|
-
let
|
|
13
|
-
let clientInitializationPromise = null;
|
|
12
|
+
let httpServer = null;
|
|
14
13
|
const server = new Server({
|
|
15
14
|
name: SERVER_NAME,
|
|
16
15
|
version: SERVER_VERSION,
|
|
@@ -19,41 +18,17 @@ const server = new Server({
|
|
|
19
18
|
tools: {},
|
|
20
19
|
},
|
|
21
20
|
});
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
logger.
|
|
32
|
-
|
|
33
|
-
try {
|
|
34
|
-
const authManager = new GSCAuth();
|
|
35
|
-
const oauth2Client = await authManager.getAuthenticatedClient();
|
|
36
|
-
logger.info('Using cached OAuth2 tokens (auto-refresh enabled)');
|
|
37
|
-
gscClient = new GSCClient(oauth2Client);
|
|
38
|
-
const isValid = await gscClient.validateConnection();
|
|
39
|
-
if (!isValid) {
|
|
40
|
-
throw new Error('Failed to validate GSC API connection');
|
|
41
|
-
}
|
|
42
|
-
logger.info('GSC client initialized and validated successfully');
|
|
43
|
-
return gscClient;
|
|
44
|
-
}
|
|
45
|
-
catch (error) {
|
|
46
|
-
clientInitializationPromise = null;
|
|
47
|
-
logger.error('Failed to initialize GSC client', {
|
|
48
|
-
error: error instanceof Error ? error.message : String(error),
|
|
49
|
-
});
|
|
50
|
-
if (error instanceof Error && error.message.includes('not authenticated')) {
|
|
51
|
-
throw new Error('Authentication required. Please run authentication setup first. See docs/AUTHENTICATION_SETUP.md');
|
|
52
|
-
}
|
|
53
|
-
throw error;
|
|
54
|
-
}
|
|
55
|
-
})();
|
|
56
|
-
return clientInitializationPromise;
|
|
21
|
+
function createGSCClientFromToken(accessToken) {
|
|
22
|
+
logger.debug('Creating ephemeral GSC client from access token', {
|
|
23
|
+
tokenPrefix: accessToken.substring(0, 8),
|
|
24
|
+
});
|
|
25
|
+
const oauth2Client = new OAuth2Client();
|
|
26
|
+
oauth2Client.setCredentials({
|
|
27
|
+
access_token: accessToken,
|
|
28
|
+
});
|
|
29
|
+
const client = new GSCClient(oauth2Client);
|
|
30
|
+
logger.debug('Ephemeral GSC client created successfully');
|
|
31
|
+
return client;
|
|
57
32
|
}
|
|
58
33
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
59
34
|
logger.debug('Listing available tools', { count: allTools.length });
|
|
@@ -83,61 +58,16 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
83
58
|
isError: true,
|
|
84
59
|
};
|
|
85
60
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
try {
|
|
97
|
-
client = await initializeClient();
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
if (error instanceof AuthError || (error instanceof Error && error.message.includes('not authenticated'))) {
|
|
101
|
-
logger.warn('Authentication required for data tool', { tool: name });
|
|
102
|
-
return {
|
|
103
|
-
content: [
|
|
104
|
-
{
|
|
105
|
-
type: 'text',
|
|
106
|
-
text: `Authentication Required
|
|
107
|
-
|
|
108
|
-
You need to authenticate with Google Search Console before using data tools.
|
|
109
|
-
|
|
110
|
-
To authenticate, run:
|
|
111
|
-
1. auth_login - Get the authorization URL
|
|
112
|
-
2. Visit the URL in your browser and authorize access
|
|
113
|
-
3. auth_complete - Provide the authorization code from Google
|
|
114
|
-
|
|
115
|
-
After authentication, you can use all data tools including:
|
|
116
|
-
- list_properties
|
|
117
|
-
- query_by_keyword
|
|
118
|
-
- query_by_url
|
|
119
|
-
- query_advanced
|
|
120
|
-
- get_top_queries
|
|
121
|
-
- get_top_pages
|
|
122
|
-
- compare_date_ranges
|
|
123
|
-
- get_property_info
|
|
124
|
-
|
|
125
|
-
To check your authentication status at any time, run:
|
|
126
|
-
- auth_status`,
|
|
127
|
-
},
|
|
128
|
-
],
|
|
129
|
-
isError: true,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
throw error;
|
|
133
|
-
}
|
|
134
|
-
logger.debug('Executing data tool handler', { tool: name });
|
|
135
|
-
const result = await handler(params || {}, client);
|
|
136
|
-
logger.info('Data tool executed successfully', {
|
|
137
|
-
tool: name,
|
|
138
|
-
hasError: result.isError || false,
|
|
139
|
-
});
|
|
140
|
-
return result;
|
|
61
|
+
logger.warn('Tool called without HTTP authentication context', { tool: name });
|
|
62
|
+
return {
|
|
63
|
+
content: [
|
|
64
|
+
{
|
|
65
|
+
type: 'text',
|
|
66
|
+
text: 'Authentication required. Please use the HTTP endpoint with proper OAuth 2.1 authentication.',
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
isError: true,
|
|
70
|
+
};
|
|
141
71
|
}
|
|
142
72
|
catch (error) {
|
|
143
73
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -161,11 +91,10 @@ To check your authentication status at any time, run:
|
|
|
161
91
|
async function shutdown(signal) {
|
|
162
92
|
logger.info(`Received ${signal}, shutting down gracefully...`);
|
|
163
93
|
try {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
logger.info('Tool statistics', toolStats);
|
|
94
|
+
const toolStats = getToolStats();
|
|
95
|
+
logger.info('Tool statistics', toolStats);
|
|
96
|
+
if (httpServer) {
|
|
97
|
+
await httpServer.stop();
|
|
169
98
|
}
|
|
170
99
|
await server.close();
|
|
171
100
|
logger.info('Server shut down successfully');
|
|
@@ -187,10 +116,12 @@ async function main() {
|
|
|
187
116
|
platform: process.platform,
|
|
188
117
|
environment: getEnvironment(),
|
|
189
118
|
});
|
|
119
|
+
logConfiguration();
|
|
190
120
|
const toolStats = getToolStats();
|
|
191
121
|
logger.info('Server configuration', {
|
|
192
122
|
totalTools: toolStats.total,
|
|
193
123
|
tools: toolStats.names,
|
|
124
|
+
authMode: 'OAuth 2.1 (Google token passthrough with account locking)',
|
|
194
125
|
});
|
|
195
126
|
logger.debug('Tool details', {
|
|
196
127
|
tools: toolStats.tools.map((t) => ({
|
|
@@ -215,11 +146,93 @@ async function main() {
|
|
|
215
146
|
});
|
|
216
147
|
shutdown('unhandledRejection');
|
|
217
148
|
});
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
149
|
+
httpServer = createHttpServer(server, { port: config.port });
|
|
150
|
+
httpServer.setToolCallHandler(async (name, args, userEmail, accessToken) => {
|
|
151
|
+
logger.info('Tool called via HTTP', {
|
|
152
|
+
tool: name,
|
|
153
|
+
hasParams: !!args,
|
|
154
|
+
paramKeys: args ? Object.keys(args) : [],
|
|
155
|
+
user: userEmail,
|
|
156
|
+
hasAccessToken: !!accessToken,
|
|
157
|
+
});
|
|
158
|
+
try {
|
|
159
|
+
const handler = toolHandlers[name];
|
|
160
|
+
if (!handler) {
|
|
161
|
+
const availableTools = Object.keys(toolHandlers).join(', ');
|
|
162
|
+
logger.error('Tool not found', { tool: name, availableTools });
|
|
163
|
+
return {
|
|
164
|
+
content: [
|
|
165
|
+
{
|
|
166
|
+
type: 'text',
|
|
167
|
+
text: `Unknown tool: ${name}\n\nAvailable tools: ${availableTools}`,
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
isError: true,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
let client = null;
|
|
174
|
+
if (name !== 'health_check') {
|
|
175
|
+
if (!accessToken) {
|
|
176
|
+
logger.error('Access token missing for data tool', { tool: name });
|
|
177
|
+
return {
|
|
178
|
+
content: [
|
|
179
|
+
{
|
|
180
|
+
type: 'text',
|
|
181
|
+
text: 'Authentication required. Access token not provided.',
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
isError: true,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
client = createGSCClientFromToken(accessToken);
|
|
188
|
+
logger.debug('Ephemeral GSC client created for tool execution', {
|
|
189
|
+
tool: name,
|
|
190
|
+
user: userEmail,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
logger.debug('Executing tool handler', { tool: name, user: userEmail });
|
|
194
|
+
const result = await handler(args || {}, client);
|
|
195
|
+
logger.info('Tool executed successfully', {
|
|
196
|
+
tool: name,
|
|
197
|
+
hasError: result.isError || false,
|
|
198
|
+
user: userEmail,
|
|
199
|
+
});
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
204
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
205
|
+
logger.error('Tool execution failed', {
|
|
206
|
+
tool: name,
|
|
207
|
+
error: errorMessage,
|
|
208
|
+
stack: errorStack,
|
|
209
|
+
user: userEmail,
|
|
210
|
+
});
|
|
211
|
+
return {
|
|
212
|
+
content: [
|
|
213
|
+
{
|
|
214
|
+
type: 'text',
|
|
215
|
+
text: `Error executing ${name}: ${errorMessage}`,
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
isError: true,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
await httpServer.start();
|
|
223
|
+
logger.info('MCP Server started successfully', {
|
|
224
|
+
transport: 'HTTP',
|
|
225
|
+
url: `http://localhost:${config.port}`,
|
|
226
|
+
endpoints: [
|
|
227
|
+
'/.well-known/oauth-protected-resource',
|
|
228
|
+
'/health',
|
|
229
|
+
'/auth/status',
|
|
230
|
+
'/mcp',
|
|
231
|
+
],
|
|
232
|
+
authMode: 'OAuth 2.1 (Google token passthrough)',
|
|
233
|
+
});
|
|
221
234
|
logger.info(`Available tools: ${toolStats.names.join(', ')}`);
|
|
222
|
-
logger.info('
|
|
235
|
+
logger.info('Authentication: Google OAuth 2.1 via Claude Code (single-user account locking)');
|
|
223
236
|
}
|
|
224
237
|
catch (error) {
|
|
225
238
|
logger.error('Failed to start server', {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
declare global {
|
|
4
|
+
namespace Express {
|
|
5
|
+
interface Request {
|
|
6
|
+
user?: {
|
|
7
|
+
email: string;
|
|
8
|
+
userId: string;
|
|
9
|
+
accessToken: string;
|
|
10
|
+
scope?: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export interface HttpServerConfig {
|
|
16
|
+
port: number;
|
|
17
|
+
host?: string;
|
|
18
|
+
}
|
|
19
|
+
export type ToolCallHandler = (name: string, args: any, userEmail?: string, accessToken?: string) => Promise<any>;
|
|
20
|
+
export declare class HttpServer {
|
|
21
|
+
private app;
|
|
22
|
+
private server;
|
|
23
|
+
private config;
|
|
24
|
+
private toolCallHandler;
|
|
25
|
+
constructor(_mcpServer: Server, config: HttpServerConfig);
|
|
26
|
+
setToolCallHandler(handler: ToolCallHandler): void;
|
|
27
|
+
private setupRoutes;
|
|
28
|
+
private handleToolsList;
|
|
29
|
+
private handleToolsCall;
|
|
30
|
+
private handleInitialize;
|
|
31
|
+
start(): Promise<void>;
|
|
32
|
+
stop(): Promise<void>;
|
|
33
|
+
getApp(): express.Application;
|
|
34
|
+
}
|
|
35
|
+
export declare function createHttpServer(mcpServer: Server, config: HttpServerConfig): HttpServer;
|
|
36
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"AAqDA,OAAO,OAA4C,MAAM,SAAS,CAAC;AAEnE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAQnE,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,IAAI,CAAC,EAAE;gBACL,KAAK,EAAE,MAAM,CAAC;gBACd,MAAM,EAAE,MAAM,CAAC;gBACf,WAAW,EAAE,MAAM,CAAC;gBACpB,KAAK,CAAC,EAAE,MAAM,CAAC;aAChB,CAAC;SACH;KACF;CACF;AAwCD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAqQD,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAKlH,qBAAa,UAAU;IACrB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,eAAe,CAAgC;gBAE3C,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB;IAYxD,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAOlD,OAAO,CAAC,WAAW;YA+JL,eAAe;YAmBf,eAAe;YA8Bf,gBAAgB;IAkBxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B3B,MAAM,IAAI,OAAO,CAAC,WAAW;CAG9B;AAKD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAExF"}
|