@sashido/mcp-server 0.0.0-stage → 0.2.1
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/LICENSE +21 -0
- package/README.md +201 -2
- package/dist/access.d.ts +47 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +156 -0
- package/dist/access.js.map +1 -0
- package/dist/advice/format.d.ts +22 -0
- package/dist/advice/format.d.ts.map +1 -0
- package/dist/advice/format.js +70 -0
- package/dist/advice/format.js.map +1 -0
- package/dist/advice/schemaChecks.d.ts +17 -0
- package/dist/advice/schemaChecks.d.ts.map +1 -0
- package/dist/advice/schemaChecks.js +64 -0
- package/dist/advice/schemaChecks.js.map +1 -0
- package/dist/audit.d.ts +32 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +41 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth.d.ts +17 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +72 -0
- package/dist/auth.js.map +1 -0
- package/dist/bin/login.d.ts +3 -0
- package/dist/bin/login.d.ts.map +1 -0
- package/dist/bin/login.js +16 -0
- package/dist/bin/login.js.map +1 -0
- package/dist/bin/mcp-server.d.ts +3 -0
- package/dist/bin/mcp-server.d.ts.map +1 -0
- package/dist/bin/mcp-server.js +27 -0
- package/dist/bin/mcp-server.js.map +1 -0
- package/dist/client/parse.d.ts +219 -0
- package/dist/client/parse.d.ts.map +1 -0
- package/dist/client/parse.js +414 -0
- package/dist/client/parse.js.map +1 -0
- package/dist/client/sashido.d.ts +213 -0
- package/dist/client/sashido.d.ts.map +1 -0
- package/dist/client/sashido.js +289 -0
- package/dist/client/sashido.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +70 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +33 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +132 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +60 -0
- package/dist/server.js.map +1 -0
- package/dist/session/redis-client.d.ts +23 -0
- package/dist/session/redis-client.d.ts.map +1 -0
- package/dist/session/redis-client.js +136 -0
- package/dist/session/redis-client.js.map +1 -0
- package/dist/session/session-manager.d.ts +6 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +68 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/sse-pubsub.d.ts +23 -0
- package/dist/session/sse-pubsub.d.ts.map +1 -0
- package/dist/session/sse-pubsub.js +121 -0
- package/dist/session/sse-pubsub.js.map +1 -0
- package/dist/session/types.d.ts +43 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/tools/advisor/index.d.ts +3 -0
- package/dist/tools/advisor/index.d.ts.map +1 -0
- package/dist/tools/advisor/index.js +149 -0
- package/dist/tools/advisor/index.js.map +1 -0
- package/dist/tools/apps/index.d.ts +3 -0
- package/dist/tools/apps/index.d.ts.map +1 -0
- package/dist/tools/apps/index.js +113 -0
- package/dist/tools/apps/index.js.map +1 -0
- package/dist/tools/audit/index.d.ts +6 -0
- package/dist/tools/audit/index.d.ts.map +1 -0
- package/dist/tools/audit/index.js +69 -0
- package/dist/tools/audit/index.js.map +1 -0
- package/dist/tools/builds/index.d.ts +3 -0
- package/dist/tools/builds/index.d.ts.map +1 -0
- package/dist/tools/builds/index.js +85 -0
- package/dist/tools/builds/index.js.map +1 -0
- package/dist/tools/classes/index.d.ts +3 -0
- package/dist/tools/classes/index.d.ts.map +1 -0
- package/dist/tools/classes/index.js +223 -0
- package/dist/tools/classes/index.js.map +1 -0
- package/dist/tools/cloud-functions/index.d.ts +3 -0
- package/dist/tools/cloud-functions/index.d.ts.map +1 -0
- package/dist/tools/cloud-functions/index.js +154 -0
- package/dist/tools/cloud-functions/index.js.map +1 -0
- package/dist/tools/deployments/index.d.ts +3 -0
- package/dist/tools/deployments/index.d.ts.map +1 -0
- package/dist/tools/deployments/index.js +124 -0
- package/dist/tools/deployments/index.js.map +1 -0
- package/dist/tools/engines/index.d.ts +3 -0
- package/dist/tools/engines/index.d.ts.map +1 -0
- package/dist/tools/engines/index.js +68 -0
- package/dist/tools/engines/index.js.map +1 -0
- package/dist/tools/env/index.d.ts +3 -0
- package/dist/tools/env/index.d.ts.map +1 -0
- package/dist/tools/env/index.js +116 -0
- package/dist/tools/env/index.js.map +1 -0
- package/dist/tools/files/index.d.ts +3 -0
- package/dist/tools/files/index.d.ts.map +1 -0
- package/dist/tools/files/index.js +132 -0
- package/dist/tools/files/index.js.map +1 -0
- package/dist/tools/health/index.d.ts +3 -0
- package/dist/tools/health/index.d.ts.map +1 -0
- package/dist/tools/health/index.js +47 -0
- package/dist/tools/health/index.js.map +1 -0
- package/dist/tools/infrastructure/deployments.d.ts +23 -0
- package/dist/tools/infrastructure/deployments.d.ts.map +1 -0
- package/dist/tools/infrastructure/deployments.js +76 -0
- package/dist/tools/infrastructure/deployments.js.map +1 -0
- package/dist/tools/infrastructure/index.d.ts +9 -0
- package/dist/tools/infrastructure/index.d.ts.map +1 -0
- package/dist/tools/infrastructure/index.js +164 -0
- package/dist/tools/infrastructure/index.js.map +1 -0
- package/dist/tools/jobs/index.d.ts +3 -0
- package/dist/tools/jobs/index.d.ts.map +1 -0
- package/dist/tools/jobs/index.js +338 -0
- package/dist/tools/jobs/index.js.map +1 -0
- package/dist/tools/logs/index.d.ts +3 -0
- package/dist/tools/logs/index.d.ts.map +1 -0
- package/dist/tools/logs/index.js +133 -0
- package/dist/tools/logs/index.js.map +1 -0
- package/dist/tools/objects/index.d.ts +3 -0
- package/dist/tools/objects/index.d.ts.map +1 -0
- package/dist/tools/objects/index.js +185 -0
- package/dist/tools/objects/index.js.map +1 -0
- package/dist/tools/push/index.d.ts +3 -0
- package/dist/tools/push/index.d.ts.map +1 -0
- package/dist/tools/push/index.js +434 -0
- package/dist/tools/push/index.js.map +1 -0
- package/dist/tools/types/index.d.ts +3 -0
- package/dist/tools/types/index.d.ts.map +1 -0
- package/dist/tools/types/index.js +45 -0
- package/dist/tools/types/index.js.map +1 -0
- package/dist/tools/webhooks/index.d.ts +3 -0
- package/dist/tools/webhooks/index.d.ts.map +1 -0
- package/dist/tools/webhooks/index.js +443 -0
- package/dist/tools/webhooks/index.js.map +1 -0
- package/dist/transports/http.d.ts +4 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +241 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/stdio.d.ts +7 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js +29 -0
- package/dist/transports/stdio.js.map +1 -0
- package/dist/typegen/dart.d.ts +3 -0
- package/dist/typegen/dart.d.ts.map +1 -0
- package/dist/typegen/dart.js +84 -0
- package/dist/typegen/dart.js.map +1 -0
- package/dist/typegen/kotlin.d.ts +3 -0
- package/dist/typegen/kotlin.d.ts.map +1 -0
- package/dist/typegen/kotlin.js +84 -0
- package/dist/typegen/kotlin.js.map +1 -0
- package/dist/typegen/model.d.ts +37 -0
- package/dist/typegen/model.d.ts.map +1 -0
- package/dist/typegen/model.js +82 -0
- package/dist/typegen/model.js.map +1 -0
- package/dist/typegen/swift.d.ts +3 -0
- package/dist/typegen/swift.d.ts.map +1 -0
- package/dist/typegen/swift.js +105 -0
- package/dist/typegen/swift.js.map +1 -0
- package/dist/typegen/typescript.d.ts +3 -0
- package/dist/typegen/typescript.d.ts.map +1 -0
- package/dist/typegen/typescript.js +73 -0
- package/dist/typegen/typescript.js.map +1 -0
- package/dist/upgrade/rules.d.ts +27 -0
- package/dist/upgrade/rules.d.ts.map +1 -0
- package/dist/upgrade/rules.js +133 -0
- package/dist/upgrade/rules.js.map +1 -0
- package/dist/upgrade/scan.d.ts +18 -0
- package/dist/upgrade/scan.d.ts.map +1 -0
- package/dist/upgrade/scan.js +38 -0
- package/dist/upgrade/scan.js.map +1 -0
- package/dist/upgrade/versions.d.ts +8 -0
- package/dist/upgrade/versions.d.ts.map +1 -0
- package/dist/upgrade/versions.js +25 -0
- package/dist/upgrade/versions.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +68 -4
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { appConfig } from '../config.js';
|
|
3
|
+
import { auditHeaders } from '../audit.js';
|
|
4
|
+
export class SashidoApiError extends Error {
|
|
5
|
+
statusCode;
|
|
6
|
+
code;
|
|
7
|
+
constructor(message, statusCode, code) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.statusCode = statusCode;
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.name = 'SashidoApiError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The SashiDo API with a personal access token. The token's scopes decide
|
|
16
|
+
* what each call may do; app keys are never returned to it.
|
|
17
|
+
*/
|
|
18
|
+
export class SashidoClient {
|
|
19
|
+
client;
|
|
20
|
+
constructor(token, apiUrl = appConfig.sashido.apiUrl) {
|
|
21
|
+
this.client = axios.create({
|
|
22
|
+
baseURL: apiUrl,
|
|
23
|
+
headers: {
|
|
24
|
+
'Content-Type': 'application/json',
|
|
25
|
+
Authorization: `Bearer ${token}`,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
// the tool call this request belongs to, for the API's audit log
|
|
29
|
+
this.client.interceptors.request.use((config) => {
|
|
30
|
+
for (const [name, value] of Object.entries(auditHeaders())) {
|
|
31
|
+
config.headers.set(name, value);
|
|
32
|
+
}
|
|
33
|
+
return config;
|
|
34
|
+
});
|
|
35
|
+
this.client.interceptors.response.use((response) => response, (error) => {
|
|
36
|
+
if (error.response) {
|
|
37
|
+
const { status, data } = error.response;
|
|
38
|
+
// the API answers {code, message}, a plain text message (errors
|
|
39
|
+
// thrown in controllers) or, for invalid input, the fields
|
|
40
|
+
const body = data;
|
|
41
|
+
let message = error.message;
|
|
42
|
+
if (typeof body === 'string' && body.trim()) {
|
|
43
|
+
message = body.trim();
|
|
44
|
+
}
|
|
45
|
+
else if (data && typeof data.message === 'string') {
|
|
46
|
+
message = data.message;
|
|
47
|
+
}
|
|
48
|
+
else if (body && typeof body === 'object') {
|
|
49
|
+
message = `Invalid input: ${JSON.stringify(body)}`;
|
|
50
|
+
}
|
|
51
|
+
throw new SashidoApiError(message, status, data?.code);
|
|
52
|
+
}
|
|
53
|
+
throw new SashidoApiError(error.message, 500);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// SECURITY: Fields that are SAFE to expose (case-insensitive)
|
|
57
|
+
static ALLOWED_FIELDS = new Set([
|
|
58
|
+
'restapikey', 'restApiKey',
|
|
59
|
+
'serverurl', 'serverUrl',
|
|
60
|
+
'appid', 'appId',
|
|
61
|
+
'clientkey', 'clientKey',
|
|
62
|
+
'dotnetkey', 'dotNetKey',
|
|
63
|
+
'filekey', 'fileKey',
|
|
64
|
+
'javascriptkey', 'javascriptKey',
|
|
65
|
+
's3_base_url', 's3BaseUrl',
|
|
66
|
+
].map(f => f.toLowerCase()));
|
|
67
|
+
// SECURITY: List of sensitive field names to ALWAYS remove (case-insensitive)
|
|
68
|
+
static SENSITIVE_FIELDS = new Set([
|
|
69
|
+
'masterkey', 'webhookkey', 'serverkey',
|
|
70
|
+
'databaseuri', 'mongodburl', 'database_uri', 'connectionstring',
|
|
71
|
+
'database', 'mongodb',
|
|
72
|
+
'bcdn_zone_id', 'bcdn_last_tracked_transfer',
|
|
73
|
+
'gcm', 'gcmsenderid', 'gcmapikey',
|
|
74
|
+
'firebase', 'firebaseconfig',
|
|
75
|
+
'oauthgoogleclientid', 'oauthgoogleclientsecret', 'oauth',
|
|
76
|
+
'privatekey', 'serviceaccount',
|
|
77
|
+
'env', 'customdeploymentenv',
|
|
78
|
+
'password', 'secret', 'credential',
|
|
79
|
+
'accesskey', 'secretkey', 'authkey', 'encryptionkey',
|
|
80
|
+
'limits', // deployment.limits
|
|
81
|
+
]);
|
|
82
|
+
// SECURITY: Patterns that indicate sensitive data in field names
|
|
83
|
+
static SENSITIVE_PATTERNS = [
|
|
84
|
+
/^master/i, /secret/i, /password/i, /credential/i,
|
|
85
|
+
/mongodb/i, /database/i, /connection/i,
|
|
86
|
+
/firebase/i, /gcm/i, /oauth/i, /private/i, /encrypt/i,
|
|
87
|
+
/^bcdn_/i,
|
|
88
|
+
];
|
|
89
|
+
// SECURITY: Check if a field name indicates sensitive data
|
|
90
|
+
isSensitiveField(fieldName) {
|
|
91
|
+
const lowerName = fieldName.toLowerCase();
|
|
92
|
+
// First check if it's explicitly allowed
|
|
93
|
+
if (SashidoClient.ALLOWED_FIELDS.has(lowerName)) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
// Check exact matches
|
|
97
|
+
if (SashidoClient.SENSITIVE_FIELDS.has(lowerName)) {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
// Check patterns
|
|
101
|
+
return SashidoClient.SENSITIVE_PATTERNS.some(pattern => pattern.test(fieldName));
|
|
102
|
+
}
|
|
103
|
+
// SECURITY: Deep sanitize any object, removing sensitive fields recursively
|
|
104
|
+
deepSanitize(obj) {
|
|
105
|
+
if (obj === null || obj === undefined) {
|
|
106
|
+
return obj;
|
|
107
|
+
}
|
|
108
|
+
if (Array.isArray(obj)) {
|
|
109
|
+
return obj.map(item => this.deepSanitize(item));
|
|
110
|
+
}
|
|
111
|
+
if (typeof obj === 'object') {
|
|
112
|
+
const sanitized = {};
|
|
113
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
114
|
+
// Skip sensitive fields entirely
|
|
115
|
+
if (this.isSensitiveField(key)) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
// Recursively sanitize nested objects
|
|
119
|
+
sanitized[key] = this.deepSanitize(value);
|
|
120
|
+
}
|
|
121
|
+
return sanitized;
|
|
122
|
+
}
|
|
123
|
+
// For strings, check if it looks like a connection string
|
|
124
|
+
if (typeof obj === 'string') {
|
|
125
|
+
const str = obj;
|
|
126
|
+
// Redact MongoDB connection strings
|
|
127
|
+
if (str.startsWith('mongodb://') || str.startsWith('mongodb+srv://')) {
|
|
128
|
+
return '[REDACTED_CONNECTION_STRING]';
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return obj;
|
|
132
|
+
}
|
|
133
|
+
// Apps - uses /users/info endpoint which returns apps under products.apps
|
|
134
|
+
// SECURITY: Filters out sensitive credentials before returning
|
|
135
|
+
async listApps() {
|
|
136
|
+
const response = await this.client.get('/users/info');
|
|
137
|
+
// Deep sanitize each app to remove ALL sensitive data
|
|
138
|
+
const apps = response.data.data.products.apps;
|
|
139
|
+
return apps.map(app => this.deepSanitize(app));
|
|
140
|
+
}
|
|
141
|
+
// Create App - POST /apps
|
|
142
|
+
async createApp(data) {
|
|
143
|
+
const response = await this.client.post('/apps', data);
|
|
144
|
+
return response.data;
|
|
145
|
+
}
|
|
146
|
+
/** The account's activity (audit log), newest first */
|
|
147
|
+
async listActivities(options = {}) {
|
|
148
|
+
const path = options.type ? `/activities/${encodeURIComponent(options.type)}` : '/activities';
|
|
149
|
+
const response = await this.client.get(path, {
|
|
150
|
+
params: { page: options.page || 1, pageSize: options.pageSize || 50 },
|
|
151
|
+
});
|
|
152
|
+
// of the app only its id and name, whatever the API includes
|
|
153
|
+
return response.data.data.map((a) => ({
|
|
154
|
+
...a,
|
|
155
|
+
app: a.app ? { objectId: a.app.objectId, name: a.app.name } : undefined,
|
|
156
|
+
}));
|
|
157
|
+
}
|
|
158
|
+
/** The app's deployments, newest first */
|
|
159
|
+
async listDeployments(appObjectId, limit = 10) {
|
|
160
|
+
const response = await this.client.get(`/apps/${encodeURIComponent(appObjectId)}/deployments`, { params: { limit } });
|
|
161
|
+
return response.data.data;
|
|
162
|
+
}
|
|
163
|
+
/** Parse Server versions apps may be created on or switched to */
|
|
164
|
+
async listParseServerVersions() {
|
|
165
|
+
const response = await this.client.get('/products/parse-server-versions');
|
|
166
|
+
return response.data.data;
|
|
167
|
+
}
|
|
168
|
+
/** Switches the app's Parse Server version; the API redeploys it */
|
|
169
|
+
async changeParseServerVersion(appObjectId, imageTag) {
|
|
170
|
+
const response = await this.client.put(`/apps/${encodeURIComponent(appObjectId)}/version`, { imageTag });
|
|
171
|
+
return response.data.data;
|
|
172
|
+
}
|
|
173
|
+
// Deploy App - POST /apps/{appObjectId}/deploy
|
|
174
|
+
async deployApp(appObjectId, region) {
|
|
175
|
+
const params = region ? `?region=${encodeURIComponent(region)}` : '';
|
|
176
|
+
await this.client.post(`/apps/${encodeURIComponent(appObjectId)}/deploy${params}`);
|
|
177
|
+
}
|
|
178
|
+
// Cancel Deployment - POST /apps/{appObjectId}/deploy/cancel
|
|
179
|
+
async cancelDeployment(appObjectId, deploymentName, region) {
|
|
180
|
+
const params = region ? `?region=${encodeURIComponent(region)}` : '';
|
|
181
|
+
await this.client.post(`/apps/${encodeURIComponent(appObjectId)}/deploy/cancel${params}`, { name: deploymentName });
|
|
182
|
+
}
|
|
183
|
+
// Get Active Deployment - GET /processes/{appObjectId}/latest-deployment
|
|
184
|
+
// Returns the currently ACTIVE deployment (serving traffic)
|
|
185
|
+
async getActiveDeployment(appObjectId) {
|
|
186
|
+
const response = await this.client.get(`/processes/${encodeURIComponent(appObjectId)}/latest-deployment`);
|
|
187
|
+
const processes = response.data;
|
|
188
|
+
let deploymentName = null;
|
|
189
|
+
let deploymentNumber = null;
|
|
190
|
+
// Extract deployment name from first hostname key
|
|
191
|
+
// Hostname format: parse-server-deployment-24-pod123 -> deployment name: parse-server-deployment-24
|
|
192
|
+
const hostnames = Object.keys(processes);
|
|
193
|
+
if (hostnames.length > 0 && hostnames[0]) {
|
|
194
|
+
const hostname = hostnames[0];
|
|
195
|
+
// Remove last segment (pod ID) to get deployment name
|
|
196
|
+
const lastDash = hostname.lastIndexOf('-');
|
|
197
|
+
deploymentName = lastDash > 0 ? hostname.slice(0, lastDash) : hostname;
|
|
198
|
+
// Extract deployment number from deployment name
|
|
199
|
+
// parse-server-deployment-24 -> 24
|
|
200
|
+
const match = deploymentName.match(/-(\d+)$/);
|
|
201
|
+
if (match && match[1]) {
|
|
202
|
+
deploymentNumber = parseInt(match[1], 10);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return { deploymentName, deploymentNumber, processes };
|
|
206
|
+
}
|
|
207
|
+
// Get Running Deployment - the deployment currently being deployed (ACTIVE + 1)
|
|
208
|
+
async getRunningDeployment(appObjectId) {
|
|
209
|
+
const active = await this.getActiveDeployment(appObjectId);
|
|
210
|
+
let deploymentName = null;
|
|
211
|
+
let deploymentNumber = null;
|
|
212
|
+
if (active.deploymentNumber !== null) {
|
|
213
|
+
deploymentNumber = active.deploymentNumber + 1;
|
|
214
|
+
deploymentName = `parse-server-deployment-${deploymentNumber}`;
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
deploymentName,
|
|
218
|
+
deploymentNumber,
|
|
219
|
+
activeDeploymentNumber: active.deploymentNumber,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
// Builds - GET /apps/{appObjectId}/builds
|
|
223
|
+
async listBuilds(appObjectId, limit) {
|
|
224
|
+
const params = limit ? `?limit=${encodeURIComponent(String(limit))}` : '';
|
|
225
|
+
const response = await this.client.get(`/apps/${encodeURIComponent(appObjectId)}/builds${params}`);
|
|
226
|
+
return response.data.data;
|
|
227
|
+
}
|
|
228
|
+
// Trigger Build - POST /apps/{appObjectId}/build
|
|
229
|
+
async triggerBuild(appObjectId, region) {
|
|
230
|
+
const params = region ? `?region=${encodeURIComponent(region)}` : '';
|
|
231
|
+
await this.client.post(`/apps/${encodeURIComponent(appObjectId)}/build${params}`);
|
|
232
|
+
}
|
|
233
|
+
// Cancel Build - POST /apps/{appObjectId}/build/cancel
|
|
234
|
+
async cancelBuild(appObjectId, buildName, region) {
|
|
235
|
+
const params = region ? `?region=${encodeURIComponent(region)}` : '';
|
|
236
|
+
await this.client.post(`/apps/${encodeURIComponent(appObjectId)}/build/cancel${params}`, { name: buildName });
|
|
237
|
+
}
|
|
238
|
+
// Environment Variables - GET /apps/{appObjectId}/env
|
|
239
|
+
async listEnvVars(appObjectId) {
|
|
240
|
+
const response = await this.client.get(`/apps/${encodeURIComponent(appObjectId)}/env`);
|
|
241
|
+
return response.data.data;
|
|
242
|
+
}
|
|
243
|
+
// Update Environment Variables - PUT /apps/{appObjectId}/env
|
|
244
|
+
async updateEnvVars(appObjectId, env) {
|
|
245
|
+
await this.client.put(`/apps/${encodeURIComponent(appObjectId)}/env`, { env });
|
|
246
|
+
}
|
|
247
|
+
// Scale App - PUT /apps/{appObjectId}/scale
|
|
248
|
+
async setScale(appObjectId, scale, region) {
|
|
249
|
+
const params = region ? `?region=${encodeURIComponent(region)}` : '';
|
|
250
|
+
await this.client.put(`/apps/${encodeURIComponent(appObjectId)}/scale${params}`, scale);
|
|
251
|
+
}
|
|
252
|
+
// Update App Name - PUT /apps/{appObjectId}/name
|
|
253
|
+
async updateAppName(appObjectId, name) {
|
|
254
|
+
await this.client.put(`/apps/${encodeURIComponent(appObjectId)}/name`, { name });
|
|
255
|
+
}
|
|
256
|
+
// Set High Availability - PUT /apps/{appObjectId}/highAvailability
|
|
257
|
+
async setHighAvailability(appObjectId, enabled) {
|
|
258
|
+
await this.client.put(`/apps/${encodeURIComponent(appObjectId)}/highAvailability`, { enabled });
|
|
259
|
+
}
|
|
260
|
+
// List available Parse Server engines - GET /products/parse-server-engines
|
|
261
|
+
async listEngines() {
|
|
262
|
+
const response = await this.client.get('/products/parse-server-engines');
|
|
263
|
+
return response.data.data;
|
|
264
|
+
}
|
|
265
|
+
// Set engine for an app - PUT /apps/{appObjectId}/engine
|
|
266
|
+
async setEngine(appObjectId, engineName, billingPolicy, region) {
|
|
267
|
+
const params = region ? `?region=${encodeURIComponent(region)}` : '';
|
|
268
|
+
await this.client.put(`/apps/${encodeURIComponent(appObjectId)}/engine${params}`, {
|
|
269
|
+
name: engineName,
|
|
270
|
+
billingPolicy,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
// The access token: scopes, apps, expiry and user - GET /tokens/current
|
|
274
|
+
async getTokenInfo() {
|
|
275
|
+
const response = await this.client.get('/tokens/current');
|
|
276
|
+
return response.data.data;
|
|
277
|
+
}
|
|
278
|
+
// The last lines of a build's log - GET /apps/{id}/builds/{buildId}/log
|
|
279
|
+
async getBuildLog(appObjectId, buildId, lines) {
|
|
280
|
+
const response = await this.client.get(`/apps/${encodeURIComponent(appObjectId)}/builds/${encodeURIComponent(buildId)}/log`, { params: lines ? { lines } : {} });
|
|
281
|
+
return response.data.data;
|
|
282
|
+
}
|
|
283
|
+
// Changes made through the API are recorded in the account's activity by
|
|
284
|
+
// the API itself (the Parse proxy logs every write), so nothing is sent.
|
|
285
|
+
async logActivity(activityType, _message) {
|
|
286
|
+
void activityType;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=sashido.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sashido.js","sourceRoot":"","sources":["../../src/client/sashido.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare const appConfig: {
|
|
2
|
+
readonly sashido: {
|
|
3
|
+
readonly apiUrl: string;
|
|
4
|
+
};
|
|
5
|
+
readonly stdio: {
|
|
6
|
+
readonly accessToken: string | undefined;
|
|
7
|
+
readonly readOnly: string | undefined;
|
|
8
|
+
readonly apps: string | undefined;
|
|
9
|
+
readonly features: string | undefined;
|
|
10
|
+
};
|
|
11
|
+
readonly server: {
|
|
12
|
+
readonly host: string;
|
|
13
|
+
readonly port: number;
|
|
14
|
+
readonly allowedOrigins: string[];
|
|
15
|
+
readonly trustProxy: boolean;
|
|
16
|
+
readonly rateLimitPerMinute: number;
|
|
17
|
+
};
|
|
18
|
+
readonly redis: {
|
|
19
|
+
readonly url: string | undefined;
|
|
20
|
+
readonly password: string | undefined;
|
|
21
|
+
readonly db: number;
|
|
22
|
+
readonly sessionTtlSeconds: number;
|
|
23
|
+
};
|
|
24
|
+
readonly logLevel: "debug" | "info" | "warn" | "error";
|
|
25
|
+
};
|
|
26
|
+
export type AppConfig = typeof appConfig;
|
|
27
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAqDA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;CAyBZ,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { config } from "dotenv";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
config();
|
|
4
|
+
const list = (value) => (value || "")
|
|
5
|
+
.split(",")
|
|
6
|
+
.map((v) => v.trim())
|
|
7
|
+
.filter(Boolean);
|
|
8
|
+
const envSchema = z.object({
|
|
9
|
+
SASHIDO_API_URL: z.string().url().default("https://api.sashido.io"),
|
|
10
|
+
// stdio only: the personal access token of the local user. Over HTTP
|
|
11
|
+
// every request brings its own token and nothing else is used.
|
|
12
|
+
SASHIDO_ACCESS_TOKEN: z.string().optional(),
|
|
13
|
+
// stdio only: narrow what the token allows, like the URL options over HTTP
|
|
14
|
+
SASHIDO_READ_ONLY: z.string().optional(),
|
|
15
|
+
SASHIDO_APPS: z.string().optional(),
|
|
16
|
+
SASHIDO_FEATURES: z.string().optional(),
|
|
17
|
+
// HTTP: listen on localhost unless a deployment says otherwise
|
|
18
|
+
HOST: z.string().default("127.0.0.1"),
|
|
19
|
+
// PORT is the standard env var for container platforms (S2I, Heroku, etc.)
|
|
20
|
+
PORT: z.coerce.number().optional(),
|
|
21
|
+
MCP_SERVER_PORT: z.coerce.number().default(3100),
|
|
22
|
+
// browser origins allowed to call the server (CORS and the DNS rebinding
|
|
23
|
+
// check); clients that aren't browsers send no Origin
|
|
24
|
+
ALLOWED_ORIGINS: z.string().optional(),
|
|
25
|
+
// behind a load balancer: trust X-Forwarded-For for the client IP
|
|
26
|
+
TRUST_PROXY: z.string().optional(),
|
|
27
|
+
// requests per minute per client IP
|
|
28
|
+
RATE_LIMIT_PER_MINUTE: z.coerce.number().default(300),
|
|
29
|
+
LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
|
|
30
|
+
// Redis lets SSE connections on one instance receive the messages posted
|
|
31
|
+
// to another (optional - falls back to in-memory for a single instance)
|
|
32
|
+
REDIS_URL: z.string().url().optional(),
|
|
33
|
+
REDIS_PASSWORD: z.string().optional(),
|
|
34
|
+
REDIS_DB: z.coerce.number().min(0).max(15).default(0),
|
|
35
|
+
SESSION_TTL_SECONDS: z.coerce.number().default(3600),
|
|
36
|
+
});
|
|
37
|
+
const parseResult = envSchema.safeParse(process.env);
|
|
38
|
+
if (!parseResult.success) {
|
|
39
|
+
console.error("Invalid environment configuration:");
|
|
40
|
+
console.error(parseResult.error.format());
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const env = parseResult.data;
|
|
44
|
+
export const appConfig = {
|
|
45
|
+
sashido: {
|
|
46
|
+
apiUrl: env.SASHIDO_API_URL,
|
|
47
|
+
},
|
|
48
|
+
stdio: {
|
|
49
|
+
accessToken: env.SASHIDO_ACCESS_TOKEN,
|
|
50
|
+
readOnly: env.SASHIDO_READ_ONLY,
|
|
51
|
+
apps: env.SASHIDO_APPS,
|
|
52
|
+
features: env.SASHIDO_FEATURES,
|
|
53
|
+
},
|
|
54
|
+
server: {
|
|
55
|
+
host: env.HOST,
|
|
56
|
+
// PORT takes precedence (standard for S2I/containers), fallback to MCP_SERVER_PORT
|
|
57
|
+
port: env.PORT ?? env.MCP_SERVER_PORT,
|
|
58
|
+
allowedOrigins: list(env.ALLOWED_ORIGINS),
|
|
59
|
+
trustProxy: env.TRUST_PROXY === "true" || env.TRUST_PROXY === "1",
|
|
60
|
+
rateLimitPerMinute: env.RATE_LIMIT_PER_MINUTE,
|
|
61
|
+
},
|
|
62
|
+
redis: {
|
|
63
|
+
url: env.REDIS_URL,
|
|
64
|
+
password: env.REDIS_PASSWORD,
|
|
65
|
+
db: env.REDIS_DB,
|
|
66
|
+
sessionTtlSeconds: env.SESSION_TTL_SECONDS,
|
|
67
|
+
},
|
|
68
|
+
logLevel: env.LOG_LEVEL,
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { McpServer, ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { ZodRawShapeCompat } from "@modelcontextprotocol/sdk/server/zod-compat.js";
|
|
3
|
+
import { Access } from "./access.js";
|
|
4
|
+
import { ParseClient } from "./client/parse.js";
|
|
5
|
+
import { SashidoClient } from "./client/sashido.js";
|
|
6
|
+
/**
|
|
7
|
+
* What the tools of one MCP server instance work with: the access token of
|
|
8
|
+
* the request (HTTP) or of the local user (stdio), and what it may do.
|
|
9
|
+
*/
|
|
10
|
+
export interface ToolContext {
|
|
11
|
+
token: string;
|
|
12
|
+
access: Access;
|
|
13
|
+
/** The SashiDo API with the token */
|
|
14
|
+
sashido(): SashidoClient;
|
|
15
|
+
/** An app's Parse Server, through the API's proxy */
|
|
16
|
+
parse(appObjectId: string): ParseClient;
|
|
17
|
+
/** The app's name, for messages */
|
|
18
|
+
appName(appObjectId: string): Promise<string>;
|
|
19
|
+
/** An app's objectId from its objectId or its name */
|
|
20
|
+
resolveApp(value: string): Promise<string>;
|
|
21
|
+
}
|
|
22
|
+
export declare function createToolContext(token: string, access: Access, apiUrl?: string): ToolContext;
|
|
23
|
+
/** server.tool(name, description, schema, handler), as the SDK types it */
|
|
24
|
+
export interface ToolServer {
|
|
25
|
+
tool<Args extends ZodRawShapeCompat>(name: string, description: string, schema: Args, handler: ToolCallback<Args>): void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Registers a group's tools on the MCP server, but only those the access
|
|
29
|
+
* allows (see access.ts), each with annotations so clients can ask before
|
|
30
|
+
* changes and deletions. Tools taking appObjectId accept an app's name too.
|
|
31
|
+
*/
|
|
32
|
+
export declare function toolServer(server: McpServer, group: string, access: Access, registered?: string[], ctx?: ToolContext): ToolServer;
|
|
33
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAExF,OAAO,EAAE,MAAM,EAAiC,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAO,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAmBzD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,OAAO,IAAI,aAAa,CAAC;IACzB,qDAAqD;IACrD,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAAC;IACxC,mCAAmC;IACnC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,sDAAsD;IACtD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAiC,GACxC,WAAW,CAsDb;AAED,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,IAAI,SAAS,iBAAiB,EACjC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,GAC1B,IAAI,CAAC;CACT;AAkBD;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,MAAM,EAAO,EACzB,GAAG,CAAC,EAAE,WAAW,GAChB,UAAU,CA4CZ"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { annotationsFor, isToolAllowed } from "./access.js";
|
|
3
|
+
import { ParseClient } from "./client/parse.js";
|
|
4
|
+
import { SashidoClient } from "./client/sashido.js";
|
|
5
|
+
import { appConfig } from "./config.js";
|
|
6
|
+
import { logToolCall, newRequestId, runToolCall } from "./audit.js";
|
|
7
|
+
/**
|
|
8
|
+
* The AI client calling, e.g. "claude-code/2.1.0": from the MCP initialize
|
|
9
|
+
* (stdio, SSE), or the HTTP request's User-Agent (stateless HTTP, where
|
|
10
|
+
* each request has its own server).
|
|
11
|
+
*/
|
|
12
|
+
function clientOf(server, extra) {
|
|
13
|
+
const info = server.server.getClientVersion();
|
|
14
|
+
if (info && info.name) {
|
|
15
|
+
return `${info.name}/${info.version || "?"}`.slice(0, 100);
|
|
16
|
+
}
|
|
17
|
+
const headers = (extra || {}).requestInfo?.headers;
|
|
18
|
+
const agent = headers && headers["user-agent"];
|
|
19
|
+
return typeof agent === "string" ? agent.slice(0, 100) : undefined;
|
|
20
|
+
}
|
|
21
|
+
export function createToolContext(token, access, apiUrl = appConfig.sashido.apiUrl) {
|
|
22
|
+
const assertApp = (appObjectId) => {
|
|
23
|
+
if (access.appIds && access.appIds.indexOf(appObjectId) === -1) {
|
|
24
|
+
// the API refuses it too; this says why up front
|
|
25
|
+
throw new Error(`This connection is limited to other apps (${access.appIds.join(", ")}).`);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
// one server instance serves one request (HTTP) or one user (stdio)
|
|
29
|
+
let apps = null;
|
|
30
|
+
const listApps = () => {
|
|
31
|
+
if (!apps) {
|
|
32
|
+
apps =
|
|
33
|
+
access.scopes.indexOf("account:read") === -1
|
|
34
|
+
? Promise.resolve(null)
|
|
35
|
+
: new SashidoClient(token, apiUrl).listApps().catch(() => null);
|
|
36
|
+
}
|
|
37
|
+
return apps;
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
token,
|
|
41
|
+
access,
|
|
42
|
+
sashido: () => new SashidoClient(token, apiUrl),
|
|
43
|
+
parse: (appObjectId) => {
|
|
44
|
+
assertApp(appObjectId);
|
|
45
|
+
return new ParseClient(token, appObjectId, apiUrl);
|
|
46
|
+
},
|
|
47
|
+
appName: async (appObjectId) => {
|
|
48
|
+
const app = ((await listApps()) || []).find((a) => a.objectId === appObjectId);
|
|
49
|
+
return app ? app.name : appObjectId;
|
|
50
|
+
},
|
|
51
|
+
resolveApp: async (value) => {
|
|
52
|
+
const known = await listApps();
|
|
53
|
+
// without account:read the apps can't be listed: take it as an id
|
|
54
|
+
if (!known || known.some((a) => a.objectId === value)) {
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
const named = known.filter((a) => a.name.toLowerCase() === value.trim().toLowerCase());
|
|
58
|
+
if (named.length === 1) {
|
|
59
|
+
return named[0].objectId;
|
|
60
|
+
}
|
|
61
|
+
if (named.length > 1) {
|
|
62
|
+
throw new Error(`Several apps are named "${value}": ${named.map((a) => a.objectId).join(", ")}. Use the objectId.`);
|
|
63
|
+
}
|
|
64
|
+
throw new Error(`No app "${value}". Your apps: ${known.map((a) => `${a.name} (${a.objectId})`).join(", ") || "none"}.`);
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Many tools catch their errors and answer "❌ ..." or "Error ...": mark
|
|
70
|
+
* those as errors, so clients and models know the call failed (thrown
|
|
71
|
+
* errors the SDK marks itself).
|
|
72
|
+
*/
|
|
73
|
+
function markErrors(result) {
|
|
74
|
+
const r = result;
|
|
75
|
+
const first = r && r.content && r.content[0];
|
|
76
|
+
if (first && first.type === "text" && /^\s*(❌|Error\b)/.test(first.text || "") && r.isError === undefined) {
|
|
77
|
+
return { ...r, isError: true };
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
const APP_FIELD = z.string().describe("The app: its name or objectId (see list_apps)");
|
|
82
|
+
/**
|
|
83
|
+
* Registers a group's tools on the MCP server, but only those the access
|
|
84
|
+
* allows (see access.ts), each with annotations so clients can ask before
|
|
85
|
+
* changes and deletions. Tools taking appObjectId accept an app's name too.
|
|
86
|
+
*/
|
|
87
|
+
export function toolServer(server, group, access, registered = [], ctx) {
|
|
88
|
+
return {
|
|
89
|
+
tool(name, description, schema, handler) {
|
|
90
|
+
if (!isToolAllowed(name, group, access)) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
registered.push(name);
|
|
94
|
+
let finalSchema = schema;
|
|
95
|
+
let call = handler;
|
|
96
|
+
if (ctx && "appObjectId" in schema) {
|
|
97
|
+
finalSchema = { ...schema, appObjectId: APP_FIELD };
|
|
98
|
+
const inner = call;
|
|
99
|
+
call = async (args, extra) => {
|
|
100
|
+
const input = args;
|
|
101
|
+
const appObjectId = await ctx.resolveApp(input.appObjectId);
|
|
102
|
+
return inner({ ...input, appObjectId }, extra);
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const finalHandler = async (args, extra) => {
|
|
106
|
+
const toolCall = {
|
|
107
|
+
tool: name,
|
|
108
|
+
mcpClient: clientOf(server, extra),
|
|
109
|
+
requestId: newRequestId(),
|
|
110
|
+
};
|
|
111
|
+
const started = Date.now();
|
|
112
|
+
let result;
|
|
113
|
+
try {
|
|
114
|
+
result = markErrors(await runToolCall(toolCall, async () => call(args, extra)));
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
const input = args;
|
|
119
|
+
logToolCall({
|
|
120
|
+
...toolCall,
|
|
121
|
+
token: ctx ? ctx.token : "",
|
|
122
|
+
app: typeof input.appObjectId === "string" ? input.appObjectId : undefined,
|
|
123
|
+
ok: !!result && !result.isError,
|
|
124
|
+
durationMs: Date.now() - started,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
server.tool(name, description, finalSchema, annotationsFor(name), finalHandler);
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { createServer, McpServer, SERVER_NAME, SERVER_VERSION } from './server.js';
|
|
2
|
+
export { appConfig } from './config.js';
|
|
3
|
+
export { AuthError, bearerToken, getTokenInfo, isAccessToken } from './auth.js';
|
|
4
|
+
export { TOOL_POLICY, isToolAllowed, narrowAccess } from './access.js';
|
|
5
|
+
export type { Access, Scope, ToolPolicy } from './access.js';
|
|
6
|
+
export { createToolContext } from './context.js';
|
|
7
|
+
export type { ToolContext } from './context.js';
|
|
8
|
+
export { SashidoClient } from './client/sashido.js';
|
|
9
|
+
export { ParseClient } from './client/parse.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createServer, McpServer, SERVER_NAME, SERVER_VERSION } from './server.js';
|
|
2
|
+
export { appConfig } from './config.js';
|
|
3
|
+
export { AuthError, bearerToken, getTokenInfo, isAccessToken } from './auth.js';
|
|
4
|
+
export { TOOL_POLICY, isToolAllowed, narrowAccess } from './access.js';
|
|
5
|
+
export { createToolContext } from './context.js';
|
|
6
|
+
export { SashidoClient } from './client/sashido.js';
|
|
7
|
+
export { ParseClient } from './client/parse.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { ToolContext, ToolServer } from './context.js';
|
|
3
|
+
import { SERVER_NAME, SERVER_VERSION } from './version.js';
|
|
4
|
+
export { SERVER_NAME, SERVER_VERSION };
|
|
5
|
+
/** Tool groups (the `features` option), each the folder under src/tools */
|
|
6
|
+
export declare const TOOL_GROUPS: Record<string, (server: ToolServer, ctx: ToolContext) => void>;
|
|
7
|
+
/**
|
|
8
|
+
* An MCP server for one access token: only the tools its scopes, read-only
|
|
9
|
+
* mode, app limit and feature groups allow are registered.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createServer(ctx: ToolContext, registered?: string[]): McpServer;
|
|
12
|
+
export { McpServer };
|
|
13
|
+
//# sourceMappingURL=server.d.ts.map
|