PoisonDash MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| POISONDASH_ADMIN | No | Cosmetic visibility gate for admin tools in tools/list. The backend still enforces the real role check. | false |
| POISONDASH_EMAIL | No | Login email used with POISONDASH_PASSWORD for authentication and silent 401 recovery. Mutually exclusive with POISONDASH_TOKEN. | |
| POISONDASH_TOKEN | No | Pre-set JWT for authentication. Mutually exclusive with POISONDASH_EMAIL/POISONDASH_PASSWORD; if both are set, the token wins and the credentials are ignored with a warning on stderr. | |
| POISONDASH_API_URL | No | Base URL of the PoisonDash backend. A path prefix (e.g. https://host/poisondash) is preserved. | http://localhost:8321 |
| POISONDASH_PASSWORD | No | Login password used with POISONDASH_EMAIL for authentication and silent 401 recovery. Mutually exclusive with POISONDASH_TOKEN. | |
| POISONDASH_OUTPUT_DIR | No | The only directory get_sanitized_dataset is allowed to write into. Defaults to the user's Downloads folder, else a temp dir. | |
| POISONDASH_TIMEOUT_MS | No | Per-request timeout in milliseconds. Covers the JSON body as well as headers; the streamed get_sanitized_dataset download is bounded only until headers arrive. | 60000 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_dashboard_summaryA | Get the calling user's dashboard: counts of their datasets/models/experiments, their 5 most recent datasets and experiments, storage usage, and the latest analysis from their most recent completed/running experiment. Counts and recent items are scoped to the logged-in user even for admins; storage is reported both per-user (against the caller's quota) and installation-wide (against the system cap). For system-wide state across all users, use get_system_stats (admin only). |
| list_datasetsA | List the caller's own datasets and/or models (uploaded or generated). Per-user: only shows items the caller owns, with no server-side status filter -- the owner sees all of their own items regardless of approval state. Use type to filter to just 'dataset' or just 'model'. |
| get_datasetA | Get full detail on a single dataset or model by ID: generation status/progress, attack type, base dataset, poison ratio, and moderation (approval) state. Note: the generation parameters used to create the dataset and its on-disk file path are intentionally not exposed by the API -- no endpoint returns them. |
| list_available_attacksA | List the poisoning attacks PoisonDash can generate (lc, narcissus, sa, htb), with which base datasets each supports and which extra parameters each requires. Optionally filter to attacks that support a specific base_dataset. Parameter descriptions are client-supplied documentation, not part of the API response. |
| get_default_configurationA | Get the built-in default pipeline configuration (id=0, a virtual template, not a saved row). Use this to see PoisonDash's default hyperparameters before creating a real configuration. |
| get_configurationA | Get a single saved pipeline configuration by ID, including the batch-level and sample-level epoch counts that experiment results do not carry. This is the source of truth for an experiment's real hyperparameters: take configuration_id from list_experiments and look it up here. |
| list_configurationsB | List the caller's own saved pipeline configurations. |
| create_configurationA | Create a new pipeline configuration. Any field you omit takes the backend's own default (see get_default_configuration). A runnable configuration needs BOTH dataset_id (the suspect dataset) and clean_dataset_id (the clean reference set) -- running a pipeline without the clean dataset raises FileNotFoundError. dataset_id/clean_dataset_id/model_id must reference datasets or models the caller owns (admins can reference anyone's), and a rejected dataset cannot be used. |
| update_configurationA | Update fields on an existing configuration. Only the fields you pass are sent to the API and changed -- omitted fields keep their current value (the backend uses exclude_unset semantics). Do not pass a field just to keep it the same. Pass null for dataset_id, clean_dataset_id, or model_id to detach that reference. |
| create_experimentA | Create a new experiment bound to an existing configuration (the caller must own the configuration, or be admin). Does not start the run -- call run_experiment with the returned id next. |
| run_experimentA | Start (or restart) an experiment's detection pipeline in the background. Fails with 409 if already running, or 400 if the linked configuration/dataset is missing or was rejected by an admin. Poll get_experiment_status or get_experiment_logs afterward -- this call returns as soon as the run is queued. |
| cancel_experimentA | Cancel a running or pending experiment. If a background thread is actively running, this only requests cancellation -- status reads 'cancelling' until it finishes unwinding. |
| list_experimentsA | List the caller's own experiments. There is no server-side status filter -- fetch and filter by |
| get_experiment_statusB | Poll an experiment's run status and progress percentage. |
| get_experiment_logsA | Fetch new log lines for a running or finished experiment. Poll with |
| get_experiment_resultsA | Get the detection results for a completed experiment: summary counts, average poisoning score, score distribution, threshold, important features, and runtime. Set include_per_sample_scores=true to also include the raw per-sample scores (large -- displayed truncated for very large sets). Failed/cancelled runs may return only a status stub with a log tail. |
| get_provenance_recordsB | Get the pipeline-stage provenance trail for an experiment: batch-level feature importance (phase I), sample-level dataset composition (phase II setup), and scoring thresholds (phase II results). Summarizes the three pipeline stages. |
| compare_experimentsA | Compare multiple experiments side by side: dataset name, threshold method, threshold, detection rate, average score, and runtime. Fetches each experiment's name and results in parallel. Attack type is not available from these endpoints and is omitted (it can only be approximated via a best-effort dataset-name lookup). |
| analyze_score_distributionA | Compute summary statistics over an experiment's per-sample poisoning scores: mean, median, std, min, max, quartiles, and counts above fixed cutoffs (0.3, 0.5, 0.7) plus a chosen threshold. per_sample_scores covers only the suspect set with no clean/suspect ground-truth label, so these statistics describe the suspect score population only -- a clean-vs-suspect separation isn't computable from this data. Useful for tuning the detection threshold. |
| get_sample_imageA | Fetch a single sample from an experiment's suspect dataset as a PNG image, for visually inspecting a flagged sample. |
| get_sanitized_datasetA | Download the experiment's suspect dataset with flagged poisoned samples removed, as a .npz file suitable for re-training. Requires the experiment to be completed with per-sample scores present. The saved file always lands inside POISONDASH_OUTPUT_DIR (the user's Downloads folder by default) -- output_path is resolved relative to that directory and any attempt to escape it, including via a symlink, is refused. Won't overwrite an existing file unless overwrite=true. |
| start_generationA | Start generating a poisoned dataset with one of the 4 attacks (see list_available_attacks). Runs as a background job -- poll get_generation_status with the returned dataset id. Constraints (enforced server-side): 'lc' requires clean_model_id (an uploaded model checkpoint); 'sa' and 'htb' require source_class AND pre-generated .npy files already present on disk -- generation fails at runtime without them. Each attack only supports specific base_dataset values (see list_available_attacks). |
| get_generation_statusB | Poll the progress of a dataset generation job started with start_generation. |
| cancel_generationA | Cancel an in-progress (or pending) dataset generation job. If a background thread is actively running, this only requests cancellation -- the status will read 'cancelling' until it finishes unwinding. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 24 tools
The tools are highly distinct, adhering strictly to resource-action separation (e.g., list_datasets vs get_dataset, start_generation vs get_generation_status). Even within workflows, the specialized nature of the PoisonDash operations ensures minimal confusion.
Naming is extremely consistent, utilizing a predictable `action_resource` pattern across all operations. The use of standard verbs like `get`, `list`, `create`, `update`, `start`, and `cancel` maintains high predictability.
With 24 tools, the set is on the heavier side, but this count is justifiable given the significant complexity of the underlying ML domain. Each tool provides a necessary and distinct piece of functionality for the end-to-end data poisoning workflow.
The tool surface is remarkably complete, covering the full lifecycle: data generation, configuration management, experiment initiation, execution tracking (logs/status), result analysis, and data retrieval. There are no obvious dead ends in the core workflow.