Server data from the Official MCP Registry
Build Laravel apps through conversation. Code stored as structured JSON for surgical AI edits.
Build Laravel apps through conversation. Code stored as structured JSON for surgical AI edits.
Valid MCP server (2 strong, 2 medium validity signals). 7 known CVEs in dependencies (2 critical, 4 high severity) Package registry verified. Imported from the Official MCP Registry.
3 files analyzed · 8 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Unverified package source
We couldn't verify that the installable package matches the reviewed source code. Proceed with caution.
Set these up before or after installing:
Environment variable: STELLIFY_API_URL
Environment variable: STELLIFY_API_TOKEN
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-mattstellisoft-stellify-mcp": {
"env": {
"STELLIFY_API_URL": "your-stellify-api-url-here",
"STELLIFY_API_TOKEN": "your-stellify-api-token-here"
},
"args": [
"-y",
"@stellisoft/stellify-mcp"
],
"command": "npx"
}
}
}From the project's GitHub README.
Model Context Protocol (MCP) server for Stellify - the AI-native code generation platform.
This MCP server lets AI assistants (like Claude Desktop) interact with your Stellify projects to build Laravel and Vue.js applications incrementally. Instead of generating full code files at once, AI can:
Install globally via npm:
npm install -g @stellisoft/stellify-mcp
Get your Stellify API token:
Configure Claude Desktop:
Edit your Claude Desktop configuration file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json~/.config/claude/claude_desktop_config.jsonAdd the Stellify MCP server:
{
"mcpServers": {
"stellify": {
"command": "stellify-mcp",
"env": {
"STELLIFY_API_URL": "https://api.stellisoft.com/v1",
"STELLIFY_API_TOKEN": "your-token-here"
}
}
}
}
Restart Claude Desktop
That's it! The Stellify tools should now be available in Claude Desktop.
Once configured, you can talk to Claude naturally to build applications:
Create a new controller:
"Create a UserController in my Stellify project"
Add methods:
"Add a method called 'store' that takes a Request parameter and returns a JsonResponse"
Implement method logic:
"Add this implementation to the store method:
$user = User::create($request->validated());
return response()->json($user, 201);"
Build a Vue component:
"Create a Counter component with an increment button"
Convert HTML to elements:
"Convert this HTML to Stellify elements:
<div class='container'><h1>Hello</h1><button>Click me</button></div>"
Search your codebase:
"Search for all controller files in my project"
"Find methods related to authentication"
get_projectGet the active Stellify project for the authenticated user. Call this first before any other operations.
Parameters: None
Returns:
uuid: Project UUID (needed for most operations)name: Project namedirectories: Array of {uuid, name} for existing directoriesget_directoryGet a directory by UUID to see its contents.
Parameters:
uuid (required): The UUID of the directorycreate_directoryCreate a new directory for organizing files.
Parameters:
name (required): Directory name (e.g., "js", "css", "components")create_fileCreate a new file in a Stellify project. This creates an empty file shell - no methods, statements, or template yet.
Parameters:
directory (required): UUID of the directory (get from get_project directories array)name (required): File name without extension (e.g., "Counter", "UserController")type (required): File type - "class", "model", "controller", "middleware", or "js"extension (optional): File extension. Use "vue" for Vue components.namespace (optional): PHP namespace (e.g., "App\Services\"). Only for PHP files.includes (optional): Array of fully-qualified class names to import (e.g., ["App\\Models\\User", "Illuminate\\Http\\Request"]). Stellify will resolve these to file UUIDs, fetching from Laravel API or vendor directory if needed.Directory selection: Match the directory to your file's purpose. If the directory doesn't exist, create it first with create_directory.
| File Type | Directory | Namespace |
|---|---|---|
| Controllers | controllers | App\Http\Controllers\ |
| Models | models | App\Models\ |
| Services | services | App\Services\ |
| Middleware | middleware | App\Http\Middleware\ |
| Vue/JS | js | N/A |
Example workflow:
create_file → creates empty shell, returns file UUIDcreate_statement + add_statement_code → add variables/importscreate_method + add_method_body → add functionshtml_to_elements → create template elements (for Vue)save_file → finalize with all UUIDs wired togetherAuto-dependency creation (when auto_create_dependencies: true):
When you create a file with code like:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function store(Request $request)
{
$user = User::create($request->validated());
return response()->json($user);
}
}
Stellify will:
use statements to find dependencies (User, Request, Socialite)vendor/ directoryUser model fileincludes array with all dependency UUIDsSupported sources:
Illuminate\* classes fetched from api.laravel.comLaravel\Socialite\*, Laravel\Cashier\*, Spatie\*, Livewire\*, etc. read directly from your vendor/ directory using PHP-ParserThe response includes a dependencies report showing what was created/resolved and from which source.
get_fileGet a file by UUID with all its metadata, methods, and statements.
Parameters:
uuid (required): UUID of the filesave_fileSave/update a file with its full configuration. This finalizes the file after create_file.
Parameters:
uuid (required): UUID of the filename (required): File name (without extension)type (required): File type ("js", "class", "controller", "model", "middleware")extension (optional): File extension ("vue" for Vue SFCs)template (optional): Array of root element UUIDs for Vue <template> sectiondata (optional): Array of METHOD UUIDs only (functions)statements (optional): Array of STATEMENT UUIDs (imports, variables, refs)includes (optional): Array of file UUIDs to importImportant: data = method UUIDs only, statements = statement UUIDs (code outside methods)
search_filesSearch for files in the project by name or type.
Parameters:
name (optional): File name pattern to search fortype (optional): File type filtercreate_methodCreate a method signature in a file (without implementation).
Parameters:
file (required): UUID of the file to add the method toname (required): Method name (e.g., "increment", "store", "handleClick")visibility (optional): "public", "protected", or "private" (PHP only, default: "public")is_static (optional): Whether the method is static (PHP only, default: false)returnType (optional): Return type (e.g., "int", "string", "void")parameters (optional): Array of {name, type} objectsadd_method_bodyParse and add code to a method body. Stellify parses the code into structured JSON statements.
Parameters:
file_uuid (required): UUID of the file containing the methodmethod_uuid (required): UUID of the method to add code tocode (required): Code for the method body (just the statements, no function declaration)Example:
code: "return $a + $b;"
search_methodsSearch for methods in the project by name or within a specific file.
Parameters:
name (optional): Method name to search for (supports wildcards)file_uuid (optional): Filter results to a specific filecreate_statementCreate an empty statement in a file. This is step 1 of 2 - you must call add_statement_code next.
Parameters:
file (optional): UUID of the file to add the statement tomethod (optional): UUID of the method to add the statement to (for method body statements)Use cases:
add_statement_codeAdd code to an existing statement. This is step 2 of 2 - call after create_statement.
Parameters:
file_uuid (required): UUID of the file containing the statementstatement_uuid (required): UUID of the statement to add code tocode (required): The code to addExamples:
code: "use Illuminate\\Http\\Request;"
code: "const count = ref(0);"
code: "import { ref } from 'vue';"
get_statementGet a statement by UUID with its clauses (code tokens).
Parameters:
uuid (required): The UUID of the statementcreate_routeCreate a new route/page in a Stellify project.
Parameters:
project_id (required): The UUID of the Stellify projectname (required): Route/page name (e.g., "Home", "Counter", "About")path (required): URL path (e.g., "/", "/counter", "/about")method (required): HTTP method ("GET", "POST", "PUT", "DELETE", "PATCH")type (optional): Route type - "web" for pages, "api" for API endpoints (default: "web")data (optional): Additional route dataget_routeGet a route/page by UUID.
Parameters:
uuid (required): The UUID of the routesearch_routesSearch for routes/pages in the project by name.
Parameters:
search (optional): Search term to match route namestype (optional): Filter by route type ("web" or "api")per_page (optional): Results per page (default: 10)Stellify stores Blade views as elements instead of files. The root element's name field maps to the view name:
name="notes.index" → view('notes.index', $data)name="layouts.app" → @extends('layouts.app')name="components.card" → <x-card>Use update_element to set the name on a root element after creating it with html_to_elements.
Convention for reusable templates: Attach layouts, components, and partials to a template route (e.g., /template/app-layout, /template/card) to keep them organized and editable.
create_elementCreate a new UI element. Provide either page (route UUID) for root elements, or parent (element UUID) for child elements.
Parameters:
type (required): Element type - one of:
s-wrapper, s-input, s-form, s-svg, s-shape, s-media, s-iframes-transition, s-freestyle, s-motions-directives-chart, s-table, s-combobox, s-accordion, s-calendar, s-contiguouspage (optional): UUID of the page/route (for root elements)parent (optional): UUID of the parent element (for child elements)Using s-directive for Blade Conditionals:
s-directive elements output Blade directives (like @if, @foreach, @endif). They are sibling elements — they don't wrap children. To conditionally render content:
s-directive element with a statement for the opening directive (e.g., @if(...))s-directive element with a statement for the closing directive (e.g., @endif)Example — conditionally showing an image:
// 1. Create statement for @if
create_statement_with_code({
file: "<file-uuid>",
code: "@if($item->featured_image)"
})
// 2. Create opening directive element and set its statement
create_element({ type: "s-directive", page: "<route-uuid>" })
update_element({ uuid: "<if-directive-uuid>", data: { "statement": "<if-statement-uuid>" } })
// 3. Create the image as the next sibling
html_to_elements({ page: "<route-uuid>", elements: "<img class=\"w-full\" />" })
// Then update with dynamic src:
update_element({ uuid: "<img-uuid>", data: { "srcField": "featured_image" } })
// 4. Create statement for @endif
create_statement_with_code({ file: "<file-uuid>", code: "@endif" })
// 5. Create closing directive element
create_element({ type: "s-directive", page: "<route-uuid>" })
update_element({ uuid: "<endif-directive-uuid>", data: { "statement": "<endif-statement-uuid>" } })
The three elements render in order as siblings:
@if($item->featured_image)
<img class="w-full" src="{{ $item->featured_image }}" />
@endif
Using s-directive for Loops:
// 1. Create @foreach directive
create_statement_with_code({ file: "<file-uuid>", code: "@foreach($posts as $item)" })
create_element({ type: "s-directive", page: "<route-uuid>" })
update_element({ uuid: "<foreach-uuid>", data: { "statement": "<foreach-statement-uuid>" } })
// 2. Create loop content (article with dynamic fields)
html_to_elements({ page: "<route-uuid>", elements: "<article><h2></h2><p></p></article>" })
// Update elements to use loop item fields:
update_element({ uuid: "<h2-uuid>", data: { "textField": "title" } }) // → {{ $item->title }}
update_element({ uuid: "<p-uuid>", data: { "textField": "excerpt" } }) // → {{ $item->excerpt }}
// 3. Create @endforeach directive
create_statement_with_code({ file: "<file-uuid>", code: "@endforeach" })
create_element({ type: "s-directive", page: "<route-uuid>" })
update_element({ uuid: "<endforeach-uuid>", data: { "statement": "<endforeach-statement-uuid>" } })
Loop Item Attributes:
Inside @foreach loops, use these attributes on elements to reference $item:
textField: "fieldName" → outputs {{ $item->fieldName }}hrefField: "fieldName" → outputs href="{{ $item->fieldName }}"srcField: "fieldName" → outputs src="{{ $item->fieldName }}"hrefExpression: "{{ route('posts.show', $item->slug) }}" → for complex expressionssrcExpression, altExpression → same pattern for other attributesupdate_elementUpdate an existing UI element.
Parameters:
uuid (required): UUID of the element to updatedata (required): Object with HTML attributes and Stellify fieldsStandard HTML attributes: placeholder, href, src, type, etc.
Stellify fields:
name: Element name in editortype: Element typelocked: Prevent editing (boolean)tag: HTML tag (div, input, button, etc.)classes: CSS classes array ["class1", "class2"]text: Static text contentstatements: Array of statement UUIDs for dynamic Blade contentLoop item fields (for elements inside @foreach loops, references $item):
textField: Field name → outputs {{ $item->fieldName }}hrefField: Field name → outputs href="{{ $item->fieldName }}"srcField: Field name → outputs src="{{ $item->fieldName }}"Expression attributes (for complex Blade expressions):
hrefExpression: Full Blade expression for href (e.g., "{{ route('posts.show', $item->slug) }}")srcExpression: Full Blade expression for srcaltExpression: Full Blade expression for altEvent handlers (set value to method UUID):
click: @clicksubmit: @submitchange: @changeinput: @inputfocus: @focusblur: @blurkeydown: @keydownkeyup: @keyupmouseenter: @mouseentermouseleave: @mouseleaveget_elementGet a single element by UUID.
Parameters:
uuid (required): UUID of the elementget_element_treeGet an element with all its descendants as a hierarchical tree structure.
Parameters:
uuid (required): UUID of the root elementdelete_elementDelete an element and all its children (CASCADE).
Parameters:
uuid (required): UUID of the element to deletesearch_elementsSearch for elements in the project.
Parameters:
search (optional): Search query to match element name, type, or contenttype (optional): Filter by element typeinclude_metadata (optional): Include additional metadata (default: false)per_page (optional): Results per page, 1-100 (default: 20)html_to_elementsConvert HTML to Stellify elements in ONE operation. This is the fastest way to build interfaces!
Parameters:
elements (required): HTML string to convertpage (optional): Route UUID to attach elements to. Omit for Vue components.selection (optional): Parent element UUID to attach to (alternative to page)file (optional): Vue component file UUID. Pass this to auto-wire @click handlers to method UUIDs.test (optional): If true, returns structure without creating elements⚠️ CRITICAL: Multiple Root Elements
When passing HTML with multiple root-level elements (e.g., <header>, <main>, <footer>), only the FIRST root element gets attached to the route via routeParent. Other elements are created but become orphaned (not attached to the route).
Wrong approach (causes orphaned elements):
html_to_elements(page: routeUUID, elements: "<header>...</header><main>...</main><footer>...</footer>")
// Result: Only <header> is attached to the route. <main> and <footer> are orphaned!
Correct approach (make separate calls for each root element):
// Call 1: Header
html_to_elements(page: routeUUID, elements: "<header>...</header>")
// Call 2: Main content
html_to_elements(page: routeUUID, elements: "<main>...</main>")
// Call 3: Footer
html_to_elements(page: routeUUID, elements: "<footer>...</footer>")
Features:
{{ variable }}) and creates linked statementssave_file template arrayElement type mapping:
button, input, textarea, select → s-inputdiv, span, p, section, etc. → s-wrapperform → s-formimg, video, audio → s-medialist_globalsList all global files in the Application database. Globals are reusable, curated code that can be installed into tenant projects.
Parameters: None
get_globalGet a global file with all its methods, statements, and clauses.
Parameters:
uuid (required): UUID of the global fileinstall_globalInstall a global file from the Application database into a tenant project.
Parameters:
file_uuid (required): UUID of the global file to installdirectory_uuid (required): UUID of the directory to install intosearch_global_methodsSearch for methods across the Application database (global/framework methods).
Parameters:
query (required): Search query to find methods by nameModules are named collections of related global files that can be installed together.
list_modulesList all available modules.
Parameters: None
get_moduleGet a module with all its files.
Parameters:
uuid (required): UUID of the modulecreate_moduleCreate a new module to group related global files.
Parameters:
name (required): Unique name for the module (e.g., "laravel-sanctum-auth")description (optional): Description of what the module providesversion (optional): Version string (default: "1.0.0")tags (optional): Tags for categorization (e.g., ["auth", "api", "sanctum"])add_file_to_moduleAdd a global file to a module.
Parameters:
module_uuid (required): UUID of the modulefile_uuid (required): UUID of the global file to addorder (optional): Installation order (auto-increments if not specified)install_moduleInstall all files from a module into a tenant project.
Parameters:
module_uuid (required): UUID of the module to installdirectory_uuid (required): UUID of the directory to install files intoStellify stores your application code as structured JSON in a database, not text files. This architecture enables:
When you build with Stellify through this MCP server, code is parsed into structured data and can be assembled back into executable code when you deploy.
When you use auto_create_dependencies, Stellify resolves dependencies in this order:
Illuminate\* classes, fetch from api.laravel.comvendor/| Source | Namespaces | Method |
|---|---|---|
| Laravel API | Illuminate\* | Fetches from api.laravel.com |
| Vendor | Laravel\Socialite\* | Reads from vendor/laravel/socialite |
| Vendor | Laravel\Cashier\* | Reads from vendor/laravel/cashier |
| Vendor | Laravel\Sanctum\* | Reads from vendor/laravel/sanctum |
| Vendor | Laravel\Passport\* | Reads from vendor/laravel/passport |
| Vendor | Spatie\* | Reads from vendor/spatie/* packages |
| Vendor | Livewire\* | Reads from vendor/livewire/livewire |
| Vendor | Inertia\* | Reads from vendor/inertiajs/inertia-laravel |
For vendor packages, Stellify uses PHP-Parser to extract the actual method signatures from your installed package version - ensuring accuracy with your specific dependencies.
Directory
└── File
└── Method
├── Parameters (Clauses)
└── Statements
└── Clauses / Language Tokens
Each piece of code is broken down into:
get_project → Find directory UUIDcreate_file → type='controller', name='UserController'create_method → name='store', parameters=[{name:'request', type:'Request'}]add_method_body → code='return response()->json($request->all());'get_project → Find the 'js' directory UUIDcreate_file → type='js', extension='vue' in js directorycreate_statement + add_statement_code: "import { ref } from 'vue';"create_statement + add_statement_code: "const count = ref(0);"create_method + add_method_body → Create functionshtml_to_elements → Convert template HTML to elementsupdate_element → Wire event handlers (click → method UUID)save_file → Finalize with:
extension: 'vue'template: [rootElementUuid]data: [methodUuid] (METHOD UUIDs only)statements: [importStmtUuid, refStmtUuid] (STATEMENT UUIDs)npm run watch
npm run build
Make sure your .env file exists and contains your API token.
STELLIFY_API_URL is correctcurl -H "Authorization: Bearer YOUR_TOKEN" https://stellisoft.com/api/v1/file/searchrm -rf node_modules package-lock.json
npm install
npm run build
# Clear npm cache and reinstall
npm cache clean --force
npm uninstall -g @stellisoft/stellify-mcp
npm install -g @stellisoft/stellify-mcp
Claude Desktop (AI)
↓ (stdio)
Stellify MCP Server (Node.js)
↓ (HTTPS)
Stellify API (Laravel)
↓
Database (Structured Code)
The MCP server is a thin client that:
We welcome contributions! Please see our contributing guidelines and feel free to submit pull requests.
For issues or questions:
Stellify is building the future of AI-native software development. By storing code as structured data instead of text files, we enable a new paradigm where AI and humans collaborate seamlessly to build better software, faster.
Learn more at stellisoft.com
MIT License - see LICENSE file for details
Built with love by the Stellify team
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.
by Microsoft · Content & Media
Convert files (PDF, Word, Excel, images, audio) to Markdown for LLM consumption
by mcp-marketplace · Developer Tools
Scaffold, build, and publish TypeScript MCP servers to npm — conversationally
by mcp-marketplace · Finance
Free stock data and market news for any MCP-compatible AI assistant.