{"name":"io.github.neurarch-ai/neurarch-mcp","slug":"neurarch-ai-neurarch-mcp","title":"Neurarch","description":"Pre-checks a model change before GPU time or traffic: memory, layout, serving config, pins.","url":"https://mcp.market/server/neurarch-ai-neurarch-mcp","rating":null,"grade":"B","score":82,"certified":false,"status":"active","category":"ai","tags":["ai"],"presence":{"score":34,"stars":1,"forks":1,"downloads_week":525,"last_push_at":"2026-10-23T07:19:32.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/neurarch-ai/neurarch-mcp","website":"https://www.neurarch.com/mcp","version":"0.21.0","remotes":[],"packages":[{"registryType":"npm","identifier":"neurarch-mcp","version":"0.21.0","transport":{"type":"stdio"},"packageArguments":[{"description":"Path to a PyTorch .py file or .neurarch.json graph, or zoo:<id> for a bundled reference architecture (examples/ in the repo)","isRequired":true,"type":"positional","valueHint":"model_path"},{"description":"Reload the model file when the Neurarch app saves it","type":"named","name":"--watch"},{"description":"Expose the six mutation tools (off by default)","type":"named","name":"--write"},{"description":"Allow hf:<org/name> refs and load_hf_model (reads config files from huggingface.co)","type":"named","name":"--hf"},{"description":"Advertise the core tools only; all stay callable","type":"named","name":"--tools=core"}]}],"tools":[{"name":"add_connection","description":"Wire two existing layers: a directed edge from \"from\" to \"to\". Fails on self-loops or duplicate edges. The target layer's cached shape is invalidated. Call save_model afterwards to persist.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_layer","description":"Insert a new layer into the model. Provide the layer type, a unique name, optionally an existing layer to auto-connect from, and any layer-specific params. Returns the new layer id. Call save_model afterwards to persist to disk. WARNING: this mutates the model. Call layer_impact first when inserting into the middle of an existing path so you can warn the user about cascading shape changes.","write_action":true,"price_micros":0,"input_schema":null},{"name":"check_design","description":"Get Neurarch's full verdict on this model: is it structurally sound and ready to train, what will a training run cost and how long will it take, which deployment target fits it best and at what latency, and which decisions are still the human's to make. Call this BEFORE proposing an architecture change and again after, so you can say what your edit actually did. Broader than validate_model, which ","write_action":false,"price_micros":0,"input_schema":null},{"name":"check_edit","description":"Call after editing a model's config or architecture and before training. Give the pair: the base (base_model_path: a .py, a .neurarch.json, zoo:<id> or hf:<org/name>; or base_config) and the changed model (the server's model, model_path in the same forms, model_source, or config). base_config and config take a Hugging Face config.json as an object, as JSON text, or as a path. It returns the edits ","write_action":false,"price_micros":0,"input_schema":null},{"name":"check_parallel_layout","description":"Call this BEFORE launching a multi-GPU training job split by tensor, pipeline, data, context or expert parallelism (Megatron, NeMo, DeepSpeed, torchtitan). It answers three questions from the model graph and the layout, before the job takes a reservation. Legal: does tp x pp x dp x cp multiply out, does TP divide the attention heads, the KV heads, the hidden and FFN widths, does EP divide the expe","write_action":false,"price_micros":0,"input_schema":null},{"name":"check_pins","description":"Find Hugging Face downloads that are not pinned to a commit, before a job or a deployment loads whatever `main` points at that day. Reads Python (from_pretrained, load_dataset, hf_hub_download, snapshot_download, pipeline), notebooks, shell scripts and Dockerfiles (vllm serve, the SGLang server, huggingface-cli / hf download) and YAML model keys. Three rules: pin/hf-unpinned (no revision, warn), p","write_action":false,"price_micros":0,"input_schema":null},{"name":"check_serving_config","description":"Call this BEFORE launching or changing a vLLM, SGLang or llama.cpp server for a model (a new checkpoint, a new card, a new --max-model-len or quantization). Pass the launch command as you would run it (command), or already-parsed engine arguments (args, camelCase: tp, maxModelLen, maxNumSeqs, gpuMemoryUtilization, quantization, kvCacheDtype, ...), plus the card (gpu: h100, a100-80g, l40s, l4, ...)","write_action":false,"price_micros":0,"input_schema":null},{"name":"compare_layers","description":"Structurally diff two layers: whether they are the same type, their parameter-count delta, whether input/output shapes match, and exactly which param keys differ (only-in-a, only-in-b, and changed values). Use to answer \"are block_0 and block_1 identical?\" before deciding whether an edit to one should mirror to the other, or whether two blocks can share an implementation. When either layer cannot ","write_action":false,"price_micros":0,"input_schema":null},{"name":"delete_connection","description":"Remove a single directed edge between two existing layers. The target layer's cached shape is invalidated. Fails when no such edge exists. Call save_model afterwards.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_layer","description":"Remove a layer and every connection touching it. Cached shapes on former downstream layers are invalidated and the layer is removed from any groups it belonged to. Returns the list of layers whose shape contracts must be recomputed and the groups affected. Call save_model afterwards. WARNING: this is destructive. Call layer_impact first if the layer sits in the middle of an active path.","write_action":true,"price_micros":0,"input_schema":null},{"name":"describe_architecture","description":"One-call orientation: topologically-ordered layer pipeline, model depth (longest path), input/output shapes, total params and MACs, the top-5 heaviest layers by parameters AND by compute, and a validation rollup. Use this instead of chaining get_model_summary + param_count_by_block + flops_by_block + validate_model: it answers \"what is this model and where is the budget\" in a single call.","write_action":false,"price_micros":0,"input_schema":null},{"name":"diagnose_oom","description":"Call this after a CUDA out-of-memory error, before changing batch size. Pass the error text as printed (either PyTorch wording) and, when you can, the model and the job: model_path (a .py, a .neurarch.json from neurarch-trace, zoo:<id>, hf:<org/name>) or hf_id, plus batch, seq_len, the step it failed at, and attention. It reads the allocated, reserved-but-empty, other-process and failing-request n","write_action":false,"price_micros":0,"input_schema":null},{"name":"diff_models","description":"Structurally diff the current model against another .neurarch.json file: layers only in current, only in the other, and modified (with field-level changes), plus added/removed connections. Layers are matched by name. Use to review what changed between the model and a saved checkpoint or variant. \"current\" is the loaded model; the file you pass is \"other\", so onlyInCurrent is what this model adds r","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_pytorch","description":"Render the current graph as a runnable PyTorch nn.Module, the same generator behind the app's Export panel. Use it after editing the graph with the write tools, or to hand a zoo:/hf: architecture to the user as code. The source is returned; pass save_to to also write it to a file (honoured only under --write, and never over the .py this server was started from: the graph was derived from that file","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_layers","description":"Search layers by type, name regex, scope prefix, and/or applied augmentation, then optionally rank by parameter count. Answers \"where are all the convolutions?\", \"which layers under encoder.layer.3 are frozen?\", or \"what are the 5 biggest layers?\". Returns name, type, scope, param count, and any augmentations, and call get_layer for full detail.","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_models","description":"Walk a directory for model definitions: .py files declaring an nn.Module subclass and saved .neurarch.json graphs. Each .py is tried against the parser, so the answer distinguishes files this server can read now from ones that need a runtime trace (neurarch-trace). Use it on arrival in an unfamiliar repository, then pass the path you want as model_path to any other tool. Skips node_modules, virtua","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_path","description":"BFS shortest directed path from one layer to another. Answers \"does encoder.0.attention reach lm_head?\": returns the ordered list of layer names along the path, or null when unreachable. Useful before recommending an edit to confirm two layers are actually on the same flow.","write_action":false,"price_micros":0,"input_schema":null},{"name":"flops_by_block","description":"Group MAC counts (FLOPs \\xF7 2) by block, scope, or type. Answers \"where is compute spent?\"; pairs with param_count_by_block to find parameter-light but compute-heavy regions (attention) versus the inverse (large MLPs).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_block","description":"Drill into one block (named group, or a scope prefix like \"encoder.layer.0\"): its member layers with per-layer params and FLOPs, the block totals, and the edges crossing the block boundary: what feeds the block and what it feeds. Use after list_blocks to understand how a block connects to the rest of the graph before recommending extracting, replacing, or freezing it. When the name resolves to no ","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_design_notes","description":"Return the model's pinned design rationale: notes the user promoted from advisor warnings or agent replies, or typed manually. Each note has source/title/body/createdAt and optional affected layer ids. Use this to ground recommendations in the user's stated intent for the architecture before suggesting a change.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_layer","description":"Return the full definition of a single layer (params, shapes, notes, connections). Looks up by exact name first, then by id, then by case-insensitive substring. When nothing matches, the error names the closest layer names.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_model_summary","description":"Return a one-shot overview of the Neurarch model: layer count, connection count, total parameters, dominant layer types, and the input/output shape. Use this first to orient yourself before drilling into specific layers.","write_action":false,"price_micros":0,"input_schema":null},{"name":"history","description":"What happened the last time this exact structure trained inside your organisation: the metric it reached, how many epochs, how long, what it cost. Keyed by the graph's 8-character structural fingerprint, so it answers about the shape rather than the file, and two people who arrived at the same architecture see the same runs. Pass model_path for a model, or fingerprint to ask about one directly (a ","write_action":false,"price_micros":0,"input_schema":null},{"name":"layer_impact","description":"Compute the blast radius of changing a layer (or a regex-matched set): every upstream and downstream layer reachable through connections, flagged for shape sensitivity and weight rebuild requirements. Use this BEFORE recommending a destructive edit so you can warn the user about cascading effects. Mirrors the GitNexus impact tool.","write_action":false,"price_micros":0,"input_schema":null},{"name":"lint_model","description":"Run Neurarch's structural design rules over the model, offline and with no API key: attention head-dim and GQA divisibility, normalization and activation ordering, dropout and feature ranges, missing residuals in deep stacks, and the shape rules that can be decided statically. Returns findings with a stable rule id and severity (block | warn | info). This is the same rule set the Neurarch CI actio","write_action":true,"price_micros":0,"input_schema":null},{"name":"list_architectures","description":"Search the reference library bundled with this server: verified graphs of published architectures (DeepSeek-V3, Qwen2.5, Llama, Mixtral, Whisper, CLIP, BERT, ViT, ResNet and more), each with real dimensions from the model's config and a parameter count checked against the published one. Offline. Any read tool can then be asked about an entry by passing model_path: \"zoo:<id>\", so you can compare th","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_blocks","description":"List the model's collapsed groups (\"blocks\"): name, member count, params, FLOPs. Returns scope-derived blocks (dotted module path prefixes) when no explicit groups exist. Use this to talk about the architecture at a high level instead of layer-by-layer.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_connections","description":"Return every connection as {from, to, label?}, with optional filters by source or target layer name. Useful when get_layer's upstream/downstream is not enough and the agent needs a flat edge list (e.g. for \"what are all the residual links?\").","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_hyperparams","description":"Dump the model-level hyperparameter table (learning rate, batch size, dropout, etc.) the user has set in the Neurarch hyperparams panel. Empty object when none defined. These are training-config knobs, NOT per-layer params.","write_action":false,"price_micros":0,"input_schema":null},{"name":"load_architecture","description":"Open one reference architecture from the bundled library and describe it: pipeline, depth, parameter and compute hotspots, validation. Pass save_to to write it out as a .neurarch.json the user can edit in the app or start this server on (requires --write). For further questions, pass model_path: \"zoo:<id>\" to any tool.","write_action":false,"price_micros":0,"input_schema":null},{"name":"load_hf_model","description":"Build a graph for a Hugging Face model from its config.json and describe it. This is the one tool that reaches the network (huggingface.co only; HF_TOKEN is sent for gated repos), which is why it is listed only when the server runs with --hf. The result says whether it came from the real config or a generic family template (configSource), and quotes the parameter count HF publishes so you can see ","write_action":false,"price_micros":0,"input_schema":null},{"name":"mermaid_diagram","description":"Render the model as Mermaid flowchart syntax (top-down). The caller wraps the result in ```mermaid``` fences. Use sparingly: it gets noisy past ~30 layers; pair with namePattern via find_layers to give the user a clearer mental model.","write_action":false,"price_micros":0,"input_schema":null},{"name":"model_changes","description":"Reaches the network: GETs three public files from www.neurarch.com (no key, nothing about your code is sent). What changed in a tracked open-weight model on the Hugging Face Hub, revision by revision: config, tokenizer, chat template, generation defaults or weights, with the keys that changed, whether the change touches memory, serving or the tokenizer, and whether it is breaking under the publish","write_action":false,"price_micros":0,"input_schema":null},{"name":"modify_layer","description":"Modify an existing layer: shallow-merge new params, rename, or change scope. Returns a before/after diff. Cached shapes on this layer are invalidated when params change, so the user should reopen the model in Neurarch to recompute shape contracts. Call save_model afterwards. WARNING: shape-changing edits propagate downstream, so call layer_impact first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"param_count_by_block","description":"Group parameter counts by block (named group), scope (dotted module path), or layer type. Answers \"where do my parameters live?\", useful for finding bloated subnets.","write_action":false,"price_micros":0,"input_schema":null},{"name":"plan","description":"The plan card for this design, rendered by Neurarch: will it run, what it will cost, which GPUs it fits, which of the repository's own rules it breaks, what changed against a base design, and what happened last time this structure trained here. This is the one tool that sends the graph off the machine (POST /api/v1/plan), which is what buys the last two lines; everything else in this server is loc","write_action":false,"price_micros":0,"input_schema":null},{"name":"rank_designs","description":"Order several candidate designs for the one decision an agent cannot make by inspection: which of them to spend a training run on. Candidates are model files (model_path), zoo:<id> or hf:<id> references, or inline graphs; include_current adds the model this server holds. Blocked candidates (a pre-flight finding that means the graph will not forward-pass) rank last and are reported as budget you ca","write_action":true,"price_micros":0,"input_schema":null},{"name":"save_model","description":"Persist the current in-memory model to disk. Writes to the file passed on the command line by default; pass \"path\" to write elsewhere (will overwrite). Call this AFTER add_layer / modify_layer / add_connection: those tools only mutate memory. Returns the written path and byte count.","write_action":false,"price_micros":0,"input_schema":null},{"name":"size_training_job","description":"Call this BEFORE submitting or launching any training job (a sbatch, a Kubernetes Job, a cloud GPU reservation, a `python train.py` on a rented card). It answers what the job actually needs: the training peak memory at your batch, split into weights plus optimizer state, activations and stored attention scores; the smallest card that holds it; the largest batch each card (T4, L4, A10G, L40S, A100-","write_action":false,"price_micros":0,"input_schema":null},{"name":"suggest_fix","description":"Turn lint findings into edits to the source file: a unified diff per finding, labelled exact (a number or an order the rule pins, changed on every line that shares it) or proposal (a missing layer inserted with a note on what forward() still needs). Works on a .py; for a .neurarch.json use the write tools. Findings with no mechanical fix come back under notFixable with the reason. Apply the diff, ","write_action":false,"price_micros":0,"input_schema":null},{"name":"trace_model","description":"Trace the model at runtime with neurarch-trace (pip install neurarch-trace) and get a graph with real shapes: instantiate it in Python, run one forward pass with hooks, write a .neurarch.json. Use when find_models or parseQuality says the static parse is thin or partial. target is \"path/to/file.py:ClassOrFactory\", \"module.path:attr\" or \"hf:<repo>\"; input is the batch-first dims per model input. Th","write_action":false,"price_micros":0,"input_schema":null},{"name":"validate_model","description":"Run structural invariants over the model: cycles, dangling connection refs, duplicate ids/names, and orphan layers (no upstream / no downstream). Call before recommending a destructive edit so you can flag pre-existing issues separate from your change. Returns a list of findings with severity error|warn.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":82,"grade":"B","scanned_at":"2026-10-29T06:02:13.619Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-29T06:02:13.507Z","components":{"code":{"score":20,"max":25,"notes":["4 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 6 days ago"]},"identity":{"score":6,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"dist/index.js: … ${className}() `; code += ` model.eval() `; const GRAPH_EXAMPLE_NODES = 4; …"}],"inputs":{"packages":[{"registryType":"npm","identifier":"neurarch-mcp","version":"0.21.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-10-20T06:36:37.062Z","repositoryUrl":"git+https://github.com/neurarch-ai/neurarch-mcp.git","weeklyDownloads":525}],"repo":{"found":true,"owner":"neurarch-ai","repo":"neurarch-mcp","archived":false,"pushedAt":"2026-10-23T07:19:32Z","stars":1,"forks":1,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/279221743?v=4","ownerCreatedAt":"2026-04-25T09:15:09Z","license":"MIT"},"icon":{"url":"https://www.neurarch.com/icon-n.svg?v=2","source":"site"},"presence":{"stars":1,"forks":1,"downloadsWeek":525,"license":"MIT","lastPushAt":"2026-10-23T07:19:32.000Z","score":34}}}},"grade_history":[],"reviews":[]}