@stellisoft/stellify-mcp 0.1.16 → 0.1.18
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/dist/index.js +190 -37
- package/package.json +1 -1
- package/server.json +2 -2
package/dist/index.js
CHANGED
|
@@ -91,6 +91,39 @@ const stellify = new StellifyClient({
|
|
|
91
91
|
// - includes: Array of file UUIDs to import
|
|
92
92
|
//
|
|
93
93
|
// -----------------------------------------------------------------------------
|
|
94
|
+
// VUE COMPONENT + ROUTE PATTERN (for visual editing)
|
|
95
|
+
// -----------------------------------------------------------------------------
|
|
96
|
+
// When building Vue components, use TWO routes to enable visual editing:
|
|
97
|
+
//
|
|
98
|
+
// 1. TEMPLATE ROUTE - Holds the component's UI elements for editing
|
|
99
|
+
// - create_route: name='NotesTemplate', path='/notes-template', type='web'
|
|
100
|
+
// - html_to_elements: page=templateRouteUuid, elements='<div>...</div>'
|
|
101
|
+
// - Users can visually edit these elements in the route editor
|
|
102
|
+
//
|
|
103
|
+
// 2. DISPLAY ROUTE - The actual page that renders the component
|
|
104
|
+
// - create_route: name='Notes', path='/notes', type='web'
|
|
105
|
+
// - html_to_elements: page=displayRouteUuid, elements='<NotesApp />'
|
|
106
|
+
// - This embeds the Vue component on the page
|
|
107
|
+
//
|
|
108
|
+
// 3. VUE COMPONENT FILE - Links to template route elements
|
|
109
|
+
// - create_file: type='js', extension='vue', name='NotesApp'
|
|
110
|
+
// - save_file: template=[elementUuidsFromTemplateRoute]
|
|
111
|
+
//
|
|
112
|
+
// WHY THIS PATTERN?
|
|
113
|
+
// - Template elements need a route to be viewable/editable in the UI
|
|
114
|
+
// - The display route keeps the clean component embedding pattern
|
|
115
|
+
// - Component logic (methods, state) stays in the .vue file
|
|
116
|
+
//
|
|
117
|
+
// EXAMPLE WORKFLOW:
|
|
118
|
+
// 1. Create template route: '/notes-template' (for editing)
|
|
119
|
+
// 2. Create display route: '/notes' (for viewing)
|
|
120
|
+
// 3. html_to_elements on template route (creates editable elements)
|
|
121
|
+
// 4. html_to_elements on display route with '<NotesApp />'
|
|
122
|
+
// 5. create_file for NotesApp.vue
|
|
123
|
+
// 6. Add methods, statements, wire events
|
|
124
|
+
// 7. save_file with template pointing to template route's root element
|
|
125
|
+
//
|
|
126
|
+
// -----------------------------------------------------------------------------
|
|
94
127
|
// ELEMENT EVENT HANDLERS (for frontend files)
|
|
95
128
|
// -----------------------------------------------------------------------------
|
|
96
129
|
// Elements can have these event properties (value is method UUID):
|
|
@@ -105,9 +138,137 @@ const stellify = new StellifyClient({
|
|
|
105
138
|
// - mouseenter: Fires on mouse enter (@mouseenter)
|
|
106
139
|
// - mouseleave: Fires on mouse leave (@mouseleave)
|
|
107
140
|
//
|
|
141
|
+
// -----------------------------------------------------------------------------
|
|
142
|
+
// STELLIFY FRAMEWORK (frontend library for Vue/JS files)
|
|
143
|
+
// -----------------------------------------------------------------------------
|
|
144
|
+
// Stellify Framework is an AI-friendly frontend library with constrained APIs.
|
|
145
|
+
// Use these modules in Vue components for common frontend tasks.
|
|
146
|
+
//
|
|
147
|
+
// IMPORT PATTERN:
|
|
148
|
+
// import { Form, Http, Table } from 'stellify-framework'
|
|
149
|
+
//
|
|
150
|
+
// DATA & FORMS:
|
|
151
|
+
// Form.create({name:'',email:''}).validate({...}).store('/api/users')
|
|
152
|
+
// Table.create(data).addColumn('name').sort('name').paginate(10)
|
|
153
|
+
// List.create(items).add(item).remove(id).filter(fn).map(fn)
|
|
154
|
+
// Tree.create().setRoot(data).addChild(parentId,child).traverse(fn)
|
|
155
|
+
//
|
|
156
|
+
// NETWORK:
|
|
157
|
+
// Http.create('/api').withToken(t).get('/users').post('/users',data)
|
|
158
|
+
// Socket.create('wss://...').on('message',fn).connect().send(data)
|
|
159
|
+
// Auth.create('/api').login(creds).logout().getUser().isAuthenticated()
|
|
160
|
+
// Stream.create('/api/chat').onChunk(fn).onComplete(fn).post(data)
|
|
161
|
+
//
|
|
162
|
+
// GRAPHICS:
|
|
163
|
+
// Svg.create(800,600).rect(0,0,100,50).circle(50,50,20).text('Hi',10,10)
|
|
164
|
+
// Canvas.create(800,600).rect(0,0,100,50).circle(50,50,20).toDataURL()
|
|
165
|
+
// Graph.create().addNode('a').addNode('b').addEdge('a','b').layout('force')
|
|
166
|
+
// Scale.linear().domain([0,100]).range([0,500]).value(50) // returns 250
|
|
167
|
+
// Motion.tween(0,100,{duration:500}).onUpdate(fn).start()
|
|
168
|
+
//
|
|
169
|
+
// PLATFORM:
|
|
170
|
+
// Router.create().register('/users',component).navigate('/users')
|
|
171
|
+
// Storage.local().set('key',val).get('key').remove('key')
|
|
172
|
+
// Events.create().on('event',fn).emit('event',data)
|
|
173
|
+
// Clipboard.copy('text').paste()
|
|
174
|
+
// Notify.request().send('Title',{body:'Message'})
|
|
175
|
+
// Geo.getPosition().then(pos=>...).watchPosition(fn)
|
|
176
|
+
// Media.selectFile({accept:'image/*'}).resize(800,600).toBase64()
|
|
177
|
+
// DB.create('mydb').store({name:'items'}).open().put('items',obj)
|
|
178
|
+
// Worker.fromFunction(fn).run(data).terminate()
|
|
179
|
+
//
|
|
180
|
+
// AI & LANGUAGE:
|
|
181
|
+
// Speech.create().onResult(fn).listen({continuous:true})
|
|
182
|
+
// Speech.create().speak('Hello',{voice:'...'})
|
|
183
|
+
// Chat.create().addUser('Hi').addAssistant('Hello').getMessages()
|
|
184
|
+
// Embed.create().store('id',vector,meta).nearest(queryVec,5)
|
|
185
|
+
// Diff.lines(old,new) // [{type:'equal'|'insert'|'delete',value:'...'}]
|
|
186
|
+
//
|
|
187
|
+
// UTILITIES:
|
|
188
|
+
// Time.now().format('YYYY-MM-DD').add(7,'days').relative()
|
|
189
|
+
//
|
|
190
|
+
// KEY METHODS PER MODULE (max 7 each - AI-friendly constraint):
|
|
191
|
+
// Form: create,set,get,validate,store,update,delete
|
|
192
|
+
// Table: create,setData,addColumn,sort,filter,paginate
|
|
193
|
+
// Http: create,get,post,put,delete,withToken
|
|
194
|
+
// Stream: create,post,onChunk,onComplete,abort,getBuffer
|
|
195
|
+
// Speech: create,listen,speak,stopListening,getVoices,onResult
|
|
196
|
+
// Chat: create,addMessage,getHistory,clear,fork,truncate
|
|
197
|
+
// Embed: create,store,compare,nearest,search,toJSON
|
|
198
|
+
// Diff: chars,words,lines,apply,createPatch,similarity
|
|
199
|
+
//
|
|
108
200
|
// =============================================================================
|
|
109
201
|
// Define MCP tools
|
|
202
|
+
// Stellify Framework API - full method reference for AI code generation
|
|
203
|
+
const STELLIFY_FRAMEWORK_API = {
|
|
204
|
+
// Data & Forms
|
|
205
|
+
Form: ['create', 'set', 'get', 'getData', 'validate', 'isValid', 'getErrors', 'getError', 'reset', 'store', 'update', 'delete'],
|
|
206
|
+
Table: ['create', 'setData', 'addColumn', 'removeColumn', 'sort', 'filter', 'clearFilter', 'paginate', 'page', 'getData', 'getAllData', 'getColumns', 'getColumn', 'getTotalRows', 'getTotalPages', 'getCurrentPage', 'getPageSize', 'getSortKey', 'getSortDirection'],
|
|
207
|
+
List: ['create', 'from', 'range', 'add', 'remove', 'removeWhere', 'set', 'get', 'first', 'last', 'sort', 'sortBy', 'reverse', 'filter', 'find', 'findIndex', 'map', 'reduce', 'forEach', 'includes', 'indexOf', 'every', 'some', 'slice', 'take', 'skip', 'chunk', 'unique', 'uniqueBy', 'groupBy', 'flatten', 'concat', 'isEmpty', 'isNotEmpty', 'count', 'clear', 'toArray', 'toJSON', 'clone', 'sum', 'avg', 'min', 'max'],
|
|
208
|
+
Tree: ['create', 'setRoot', 'addChild', 'removeNode', 'getNode', 'getRoot', 'getChildren', 'getParent', 'getSiblings', 'getAncestors', 'getDescendants', 'getDepth', 'getPath', 'traverse', 'find', 'findAll', 'move', 'toArray', 'size'],
|
|
209
|
+
// Network
|
|
210
|
+
Http: ['create', 'get', 'post', 'put', 'patch', 'delete', 'withHeaders', 'withToken', 'withTimeout'],
|
|
211
|
+
Socket: ['create', 'connect', 'disconnect', 'send', 'sendEvent', 'on', 'off', 'once', 'isConnected', 'getState'],
|
|
212
|
+
Auth: ['create', 'login', 'logout', 'fetchUser', 'getUser', 'getToken', 'isAuthenticated', 'setToken', 'setUser', 'refresh', 'onAuthChange', 'offAuthChange', 'getAuthHeader'],
|
|
213
|
+
Stream: ['create', 'headers', 'withToken', 'onChunk', 'onComplete', 'onError', 'get', 'post', 'abort', 'getBuffer', 'getChunks', 'isStreaming', 'clear'],
|
|
214
|
+
// Graphics & Visualization
|
|
215
|
+
Svg: ['create', 'select', 'find', 'attr', 'attrs', 'getAttr', 'addClass', 'removeClass', 'text', 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path', 'textElement', 'group', 'clear', 'remove', 'toString', 'toElement', 'getWidth', 'getHeight'],
|
|
216
|
+
Canvas: ['create', 'fromElement', 'fromSelector', 'size', 'getWidth', 'getHeight', 'style', 'save', 'restore', 'clear', 'fill', 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'arc', 'path', 'text', 'measureText', 'drawImage', 'translate', 'rotate', 'scale', 'resetTransform', 'getPixel', 'setPixel', 'getImageData', 'putImageData', 'toDataURL', 'toBlob', 'getElement', 'getContext', 'appendTo'],
|
|
217
|
+
Graph: ['create', 'size', 'addNode', 'removeNode', 'addEdge', 'removeEdge', 'getNode', 'getNodes', 'getEdges', 'getEdgesWithPositions', 'getNeighbors', 'layout'],
|
|
218
|
+
Scale: ['linear', 'log', 'time', 'band', 'domain', 'range', 'getDomain', 'getRange', 'value', 'invert', 'ticks', 'clamp', 'padding', 'bandwidth'],
|
|
219
|
+
Axis: ['create', 'orientation', 'ticks', 'tickFormat', 'tickSize', 'getTicks', 'getOrientation', 'getTickSize', 'getRange', 'isHorizontal', 'isVertical'],
|
|
220
|
+
Motion: ['tween', 'spring', 'easing', 'onUpdate', 'onComplete', 'start', 'stop', 'isRunning', 'valueAt'],
|
|
221
|
+
// Platform APIs
|
|
222
|
+
Router: ['create', 'register', 'navigate', 'back', 'forward', 'getParams', 'getQuery', 'getCurrent', 'getState', 'onNavigate', 'offNavigate', 'start'],
|
|
223
|
+
Storage: ['local', 'session', 'set', 'get', 'remove', 'clear', 'has', 'keys', 'getAll', 'size'],
|
|
224
|
+
Events: ['create', 'on', 'off', 'once', 'emit', 'clear', 'listenerCount', 'eventNames'],
|
|
225
|
+
Clipboard: ['copy', 'paste', 'copyImage', 'copyHtml', 'isSupported', 'isWriteSupported'],
|
|
226
|
+
Notify: ['request', 'send', 'getPermission', 'isSupported', 'isGranted', 'isDenied'],
|
|
227
|
+
Geo: ['getPosition', 'watchPosition', 'stopWatching', 'stopAllWatching', 'isSupported', 'distance'],
|
|
228
|
+
Media: ['selectFile', 'selectFiles', 'capture', 'getMetadata', 'resize', 'toBase64', 'toArrayBuffer', 'toText', 'formatSize', 'isImage', 'isVideo', 'isAudio'],
|
|
229
|
+
DB: ['create', 'store', 'open', 'close', 'put', 'add', 'get', 'getAll', 'find', 'delete', 'clear', 'count', 'keys', 'update', 'batch', 'deleteDatabase', 'databases'],
|
|
230
|
+
Worker: ['create', 'fromFunction', 'fromCode', 'run', 'post', 'onMessage', 'onError', 'terminate', 'isRunning', 'getPendingCount'],
|
|
231
|
+
WorkerPool: ['create', 'fromFunction', 'run', 'map', 'terminate', 'getSize', 'getActiveCount', 'getQueueLength'],
|
|
232
|
+
// AI & Language
|
|
233
|
+
Speech: ['create', 'isSupported', 'listen', 'stopListening', 'onResult', 'onInterim', 'onEnd', 'onError', 'speak', 'stopSpeaking', 'pause', 'resume', 'getVoices', 'getVoicesByLanguage', 'isSpeaking', 'isListening'],
|
|
234
|
+
Chat: ['create', 'fromHistory', 'addMessage', 'addUser', 'addAssistant', 'addSystem', 'getMessage', 'getHistory', 'getMessages', 'getLastMessage', 'getLastUserMessage', 'getLastAssistantMessage', 'updateMessage', 'removeMessage', 'clear', 'clearAll', 'fork', 'truncate', 'count', 'countTokensEstimate', 'toJSON'],
|
|
235
|
+
Embed: ['create', 'store', 'storeMany', 'get', 'remove', 'clear', 'count', 'compare', 'nearest', 'search', 'cosineSimilarity', 'euclideanDistance', 'dotProduct', 'normalize', 'average', 'toJSON', 'fromJSON'],
|
|
236
|
+
Diff: ['chars', 'words', 'lines', 'apply', 'createPatch', 'distance', 'similarity', 'commonPrefix', 'commonSuffix'],
|
|
237
|
+
// Utilities
|
|
238
|
+
Time: ['now', 'create', 'parse', 'format', 'toISO', 'toDate', 'toTimestamp', 'toUnix', 'add', 'subtract', 'diff', 'isBefore', 'isAfter', 'isSame', 'isBetween', 'startOf', 'endOf', 'year', 'month', 'day', 'weekday', 'hour', 'minute', 'second', 'relative', 'clone'],
|
|
239
|
+
// Adapters
|
|
240
|
+
useStellify: ['(generic adapter for any module)'],
|
|
241
|
+
useForm: ['bind'],
|
|
242
|
+
useTable: ['(reactive table adapter)'],
|
|
243
|
+
};
|
|
110
244
|
const tools = [
|
|
245
|
+
{
|
|
246
|
+
name: 'get_stellify_framework_api',
|
|
247
|
+
description: `Get the complete Stellify Framework API reference for Vue/JS development.
|
|
248
|
+
|
|
249
|
+
Returns all modules and their methods for AI-friendly frontend code generation.
|
|
250
|
+
|
|
251
|
+
Use this tool when you need to:
|
|
252
|
+
- Look up available methods for a Stellify module
|
|
253
|
+
- Verify method names before generating code
|
|
254
|
+
- Understand the full API surface
|
|
255
|
+
|
|
256
|
+
Example response:
|
|
257
|
+
{
|
|
258
|
+
"Form": ["create", "set", "get", "validate", "store", "update", "delete", ...],
|
|
259
|
+
"Http": ["create", "get", "post", "put", "delete", "withToken", ...],
|
|
260
|
+
...
|
|
261
|
+
}`,
|
|
262
|
+
inputSchema: {
|
|
263
|
+
type: 'object',
|
|
264
|
+
properties: {
|
|
265
|
+
module: {
|
|
266
|
+
type: 'string',
|
|
267
|
+
description: 'Optional: specific module to get API for (e.g., "Form", "Http"). Omit to get all modules.',
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
},
|
|
111
272
|
{
|
|
112
273
|
name: 'get_project',
|
|
113
274
|
description: `Get the active Stellify project for the authenticated user.
|
|
@@ -1134,25 +1295,6 @@ SECURITY: Code runs in a sandboxed environment with limited permissions.`,
|
|
|
1134
1295
|
required: ['file', 'method'],
|
|
1135
1296
|
},
|
|
1136
1297
|
},
|
|
1137
|
-
{
|
|
1138
|
-
name: 'get_capabilities',
|
|
1139
|
-
description: `List available system-level capabilities in the Stellify framework.
|
|
1140
|
-
|
|
1141
|
-
Returns what's currently available for:
|
|
1142
|
-
- Authentication (Sanctum, session, etc.)
|
|
1143
|
-
- File storage (local, S3, etc.)
|
|
1144
|
-
- Email/notifications
|
|
1145
|
-
- Queues/jobs
|
|
1146
|
-
- Caching
|
|
1147
|
-
- Other installed packages and services
|
|
1148
|
-
|
|
1149
|
-
Use this BEFORE attempting to build features that might require system capabilities.
|
|
1150
|
-
If a capability you need is not listed, use request_capability to log it.`,
|
|
1151
|
-
inputSchema: {
|
|
1152
|
-
type: 'object',
|
|
1153
|
-
properties: {},
|
|
1154
|
-
},
|
|
1155
|
-
},
|
|
1156
1298
|
{
|
|
1157
1299
|
name: 'request_capability',
|
|
1158
1300
|
description: `Log a missing system-level capability request.
|
|
@@ -1312,7 +1454,7 @@ Examples of capabilities (packages you cannot write):
|
|
|
1312
1454
|
|
|
1313
1455
|
**WORKFLOW:**
|
|
1314
1456
|
|
|
1315
|
-
1. When a user requests functionality that might need a package/library,
|
|
1457
|
+
1. When a user requests functionality that might need a package/library, check the capabilities list from get_project FIRST.
|
|
1316
1458
|
|
|
1317
1459
|
2. If status is "available" → package is installed, proceed with business logic.
|
|
1318
1460
|
|
|
@@ -1359,16 +1501,42 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1359
1501
|
}
|
|
1360
1502
|
try {
|
|
1361
1503
|
switch (name) {
|
|
1504
|
+
case 'get_stellify_framework_api': {
|
|
1505
|
+
const moduleName = args.module;
|
|
1506
|
+
let result;
|
|
1507
|
+
if (moduleName) {
|
|
1508
|
+
const moduleApi = STELLIFY_FRAMEWORK_API[moduleName];
|
|
1509
|
+
if (moduleApi) {
|
|
1510
|
+
result = { [moduleName]: moduleApi };
|
|
1511
|
+
}
|
|
1512
|
+
else {
|
|
1513
|
+
result = { error: `Module "${moduleName}" not found. Available: ${Object.keys(STELLIFY_FRAMEWORK_API).join(', ')}` };
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
else {
|
|
1517
|
+
result = STELLIFY_FRAMEWORK_API;
|
|
1518
|
+
}
|
|
1519
|
+
return {
|
|
1520
|
+
content: [
|
|
1521
|
+
{
|
|
1522
|
+
type: 'text',
|
|
1523
|
+
text: JSON.stringify(result, null, 2),
|
|
1524
|
+
},
|
|
1525
|
+
],
|
|
1526
|
+
};
|
|
1527
|
+
}
|
|
1362
1528
|
case 'get_project': {
|
|
1363
1529
|
const result = await stellify.getProject();
|
|
1530
|
+
const projectData = result.data || result;
|
|
1531
|
+
const projectMeta = projectData.project || {};
|
|
1364
1532
|
return {
|
|
1365
1533
|
content: [
|
|
1366
1534
|
{
|
|
1367
1535
|
type: 'text',
|
|
1368
1536
|
text: JSON.stringify({
|
|
1369
1537
|
success: true,
|
|
1370
|
-
message: `Active project: "${
|
|
1371
|
-
project:
|
|
1538
|
+
message: `Active project: "${projectMeta.name || 'unknown'}" (${projectMeta.uuid || 'unknown'})`,
|
|
1539
|
+
project: projectData,
|
|
1372
1540
|
}, null, 2),
|
|
1373
1541
|
},
|
|
1374
1542
|
],
|
|
@@ -1830,21 +1998,6 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1830
1998
|
],
|
|
1831
1999
|
};
|
|
1832
2000
|
}
|
|
1833
|
-
case 'get_capabilities': {
|
|
1834
|
-
const result = await stellify.getCapabilities();
|
|
1835
|
-
return {
|
|
1836
|
-
content: [
|
|
1837
|
-
{
|
|
1838
|
-
type: 'text',
|
|
1839
|
-
text: JSON.stringify({
|
|
1840
|
-
success: true,
|
|
1841
|
-
message: 'Available framework capabilities',
|
|
1842
|
-
capabilities: result.data || result,
|
|
1843
|
-
}, null, 2),
|
|
1844
|
-
},
|
|
1845
|
-
],
|
|
1846
|
-
};
|
|
1847
|
-
}
|
|
1848
2001
|
case 'request_capability': {
|
|
1849
2002
|
const result = await stellify.requestCapability(args);
|
|
1850
2003
|
return {
|
package/package.json
CHANGED
package/server.json
CHANGED
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/Stellify-Software-Ltd/stellify-mcp",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.17",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "@stellisoft/stellify-mcp",
|
|
14
|
-
"version": "0.1.
|
|
14
|
+
"version": "0.1.17",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|