designsafe-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DESIGNSAFE_MCP_MOCK | No | Set to '1' to run the server in mock mode (no Tapis calls, no SUs). | 0 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| supported_capabilitiesA | What this server supports, by scientific domain. Consult this before promising anything. Every capability names how it is served and whether it is tested; 'candidate' and 'untested' entries need a human-run graduation before unattended use. Requests outside this map should be declined by pointing at out_of_scope. |
| plan_simulationA | Plan an OpenSees/quoFEM simulation from the decision matrix. Pass the facts you know; anything left None is inferred from the request only when unambiguous, and otherwise returned in open_questions for you to ask the user. The decision is the matrix's, not yours: do not override app_id, and compose the cells from the returned snippet, not from memory. model_language: "tcl" | "python" parallelism: "serial" | "domain-decomposition" | "single-domain-parallel-solver" | "many-independent-cases" |
| plan_calibrationA | Plan a calibration study from the method matrix. Pass what you know; unanswered facts come back as open questions. uncertainty_required: must the result carry parameter uncertainty into a downstream prediction (posterior), or is a best-fit point enough? quofem_wrappable: can quoFEM drive the model (OpenSees main script with parameter placeholders and a scalar-QoI postprocessor)? screened: has a sensitivity study already reduced the parameter set? |
| calibration_optionsA | Every calibration-stage method runnable on DesignSafe, with its engine, what it returns, and its tested/candidate status. |
| describe_materialA | Parameters, sensitivities, and the calibration sequence for a constitutive model, transcribed from its manual with page citations. Use this before planning a calibration: it answers which parameters exist, what data informs each one, and in what order to calibrate. |
| search_snippetsA | Find tested, version-pinned workflow snippets matching a query. Snippets are executed, self-checking notebooks with pinned app and dapi versions; only entries whose test passed are in the corpus. |
| search_communityA | Search every local notebook, model, and script for aligned passages. Returns the matching text itself with its source path and the index build stamp, so the caller can ground a workflow in what the community actually wrote and knows how fresh that knowledge is. Call corpus_status() to see which sources the index covers; use search_docs for documentation-only search. |
| search_docsA | Search the documentation corpus: the dapi user guide, the ds-workflows book, SimCenter quoFEM docs, and reference manuals. Grounding only, never the source of orchestration code; snippets remain the only source an agent may compose runs from. Results carry source and index stamp. Backend today is a local index over live-fetched docs; the Ask AI knowledge graph replaces it later behind this same tool. |
| corpus_statusA | What the grounding index covers and where it came from: each logical source (UW notebooks, dapi, the ds-workflows book), how it resolved (local checkout, fetched cache, or absent), how many passages it contributes, and when the index was built. An absent source means degraded grounding; say so rather than answering from partial knowledge, and fetch_corpus() can fill the gap live. |
| reindexA | Rebuild the index after mirroring new notebooks or references. |
| fetch_corpusA | Fetch grounding sources live from their canonical GitHub repos into corpus/, for deployments without local checkouts. source: fetch just one logical source by name; empty fetches every GitHub-backed source. CommunityData is not fetched here (needs Tapis auth; see corpus_status for the command). Run reindex after. |
| opensees_matrixA | Which OpenSees to use when: the decision matrix from the training deck. Returns the variant table (variant -> app_id -> when), the full scope x platform x interface matrix with its legend, and the path of the original slide image for display to the user. |
| describe_appC | The app's real interface from Tapis: inputs, parameters, defaults. |
| stage_inputsB | Upload a local folder once and return the tapis:// URI to run from. |
| build_job_requestA | Build a complete Tapis job request from the app definition. Mirrors ds.jobs.generate; returns the dict for inspection. Nothing is submitted. SimCenter apps (quoFEM) take no script_filename; dapi wires scInput.json and the driver automatically. |
| validate_jobB | Schema and sanity checks plus input existence, before any SU is spent. |
| estimate_costA | Estimated SU cost: nodes x hours, per the DesignSafe job-resources guidance. |
| approve_submissionA | Record human approval for exactly this job request; returns the token submit_job requires. The calling harness must show the trust summary (snippet, versions, cost, outputs) to a human before calling this. |
| submit_jobA | Submit a validated job. Refuses without the approval token minted by approve_submission for this exact request. |
| job_statusC | Current Tapis status for a submitted job. |
| get_resultsC | List the job archive, or return a small text file's content. |
| build_workflow_previewA | Compile a DAG of job requests without running it. tasks: [{"task_id", "job", "depends_on": [...], "input_from": {"task_id", "suffix"} (optional)}] Returns the compiled pipeline: deterministic archives, resolved edges. |
| write_manifestA | Emit the provenance manifest that makes the run reproducible. Refuses incomplete provenance: the job must be a fully built request (app, name, resources, inputs) and the uuid must belong to a job this server submitted. A manifest that cannot reproduce the run is worse than none. |
| list_my_jobsA | List jobs with optional filtering. Fetches jobs from Tapis ordered by creation date (newest first). Filters are applied client-side. Args: app_id (str, optional): Filter by application ID. status (str, optional): Filter by job status (e.g., "FINISHED"). Case-insensitive. limit (int, optional): Maximum jobs to fetch. Defaults to 100. output (str, optional): Output format. "df" for pandas DataFrame (default), "list" for list of dicts, "raw" for TapisResult objects. verbose (bool, optional): Print job count. Defaults to False. list_type (str, optional): "MY_JOBS" (default) for jobs you own, "SHARED_JOBS" for jobs shared with you, "ALL_JOBS" for both. Returns: Depends on output: DataFrame, list of dicts, or list of TapisResult objects. Raises: JobMonitorError: If the Tapis API call fails. Example: >>> df = ds.jobs.list(app_id="matlab-r2023a", status="FINISHED") >>> jobs = ds.jobs.list(output="list") >>> raw = ds.jobs.list(limit=10, output="raw") [schema introspected from dapi 0.6.1 (jobs.list); this tool is generated, not maintained by hand] |
| list_queuesA | List batch queues available on a Tapis execution system. Args: system_id (str): The ID of the execution system (e.g., "stampede3"). output (str, optional): "df" for DataFrame (default), "raw" for Tapis objects. Returns: DataFrame or List: Queues with name, maxNodes, maxMinutes, etc. Example: >>> ds.systems.queues("stampede3") [schema introspected from dapi 0.6.1 (systems.queues); this tool is generated, not maintained by hand] |
| list_systemsA | List Tapis systems you have access to. Filters out internal and project-specific systems by default. Args: category (str, optional): "hpc" for execution systems, "storage" for storage systems, "all" for everything, None for HPC + storage (default). output (str, optional): "df" for DataFrame (default), "list" for dicts. Returns: DataFrame or List[Dict]: Systems with id, host, category, authn, credentials. Example: >>> ds.systems.list() # HPC + storage >>> ds.systems.list("hpc") # HPC only with credential status >>> ds.systems.list("storage") # Storage only >>> ds.systems.list("all") # Everything including internal [schema introspected from dapi 0.6.1 (systems.list); this tool is generated, not maintained by hand] |
| list_app_templatesB | Names of the app templates that ship with dapi. [schema introspected from dapi 0.6.1 (apps.templates); this tool is generated, not maintained by hand] |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| opensees_matrix_image | The training deck's OpenSees decision matrix, as shown to humans. |
| resource_flowchart_image | Which DesignSafe resource to use: the deck's decision flowchart. |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kks32/designsafe-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server