MCP Tool Examples

From QPR ProcessAnalyzer Wiki
Jump to navigation Jump to search

This page contains example scripts intended for use as MCP tools. When developing MCP tool scripts, make sure they return a string value, as this is required for the MCP client's LLM to interpret the output correctly.

List of Models

Returns all models accessible for the user (in a CSV data) with following fields: Model name, Containing project name, Model ID, Case attributes, Event attributes, Case count, and Event count.

let result = Query(#{
	"Values": [
		#{
			"Name": "Model name",
			"Expression": "Name"
		},
		#{
			"Name": "Containing project name",
			"Expression": "Project.Name"
		},
		#{
			"Name": "Model ID",
			"Expression": "Id"
		},
		#{
			"Name": "Case attributes",
			"Expression": "ToJson(If(Status==\"Online\",OrderByValue(Flatten(EventLog.CaseAttributes.Name)), CasesDatatable?.ColumnNames ?? []))"
		},
		#{
			"Name": "Event attributes",
			"Expression": "ToJson(If(Status==\"Online\",OrderByValue(Flatten(EventLog.EventAttributes.Name)), EventsDatatable?.ColumnNames ?? []))"
		},
		#{
			"Name": "Case count",
			"Expression": "CasesDatatable?.NRows"
		},
		#{
			"Name": "Event count",
			"Expression": "EventsDatatable?.NRows"
		}
	],
	"Ordering": [
		#{
			"Name": "Containing project name",
			"Direction": "Ascending"
		},
		#{
			"Name": "Model name",
			"Direction": "Ascending"
		}
	],
	"Dimensions": null,
	"Root": "Models",
	"ContextType": "generic"
}).Collect();
return result.ToCsv();

Average case cost in specific model

Returns the average of the case Cost attribute value of all cases in the model with ID 1.

let result = Query(#{
	"Values": [
		#{
			"Name": "Average Cost",
			"Expression": "Column(\"Cost\")",
			"AggregationFunction": "average"
		}
	],
	"Dimensions": [],
	"Root": "Cases",
	"ModelId": 1,
	"ContextType": "model",
	"ProcessingMethod": "dataframe"
}).Collect();
return result.ToCsv();

Case details

Returns details of a specific case. The case ID is provided as an MCP parameter, so the following Input configuration is needed:

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "CaseId": {
      "type": "string",
      "minLength": 1,
      "description": "Unique identifier of the case (i.e, Case ID). Cases may be orders, deliveries, invoices depending on the model name."
    }
  }
}

The above schema means that there is one input parameter named CaseId containing a textual value (which cannot be null or an empty string). In addition, no other parameters are accepted ("additionalProperties": false).

The tool script that returns details of a case ID including all case attribute values:

let modelId = 1;
let dataQuery = [
		#{
			"Name": "Start time",
			"Expression": "AggregateFrom(Events, \"Min\", TimeStamp, null)"
		},
		#{
			"Name": "End time",
			"Expression": "AggregateFrom(Events, \"Max\", TimeStamp, null)"
		},
		#{
			"Name": "Duration in hours",
			"Expression": "DurationBetweenDates(\"hour\", AggregateFrom(Events, \"Min\", TimeStamp, null), AggregateFrom(Events, \"Max\", TimeStamp, null), null)"
		},
		#{
			"Name": "Latest event",
			"Expression": "AggregateFrom(Events.WithRowNumberColumn(\"RowNumber\", [TimeStamp, EventType], [CaseId], [false, false]).Where(Column(\"RowNumber\") == 1), \"Any\", EventType, null)"
		},
		#{
			"Name": "Event count",
			"Expression": "Coalesce(AggregateFrom(Events, \"Count\", null, null), 0)"
		},
		#{
			"Name": "Event types count",
			"Expression": "Coalesce(AggregateFrom(Events, \"CountDistinct\", EventType, null), 0)"
		},
		#{
			"Name": "Repeating event types",
			"Expression": "Coalesce(AggregateFrom(Events, \"Count\", null, null), 0) - Coalesce(AggregateFrom(Events, \"CountDistinct\", EventType, null), 0)"
		},
		#{
			"Name": "Variation path",
			"Expression": "AggregateFrom(Events, #{\"Function\":\"Array\",\"Ordering\":[TimeStamp, EventType]}, EventType, null)"
		}
	];

let caseAttributes = ModelById(modelId).CasesDatatable.Columns.Name.{
	let caseAttributeName = _;
	dataQuery = Concat(dataQuery, #{
		"Name": caseAttributeName,
		"Expression": `Column(${ToJson(caseAttributeName)})`
	});
};

let result = Query(#{
	"Dimensions": null,
	"Values": dataQuery,
	"MaximumRowCount": 1,
	"Root": "Cases",
	"Filter": #{
		"Items": [
			#{
				"Type": "IncludeCases",
				"Items": [
					#{
						"Type": "CaseAttributeValue",
						"Attribute": "Case Name",
						"StringifiedValues": [
							"0" + orderID
						]
					}
				]
			}
		]
	},
	"ModelId": modelId,
	"ContextType": "model",
	"ProcessingMethod": "dataframe"
}).Collect();
return result.ToCsv();

Notes:

  • The script uses the CaseId variable containing the provided CaseId parameter value (which is generated by the calling agent).
  • The model ID is hardcoded, but the model ID can also be provided as an MCP parameter.

Model filters

Returns all public filters stored to a model.

The modelId input parameter defines the model from where to get the filters:

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "modelId": {
      "type": "integer",
      "description": "Model ID (identifier)"
    }
  }
}

Output schema will be defined as follows:

{
  "type": "object",
  "properties": {
    "filters": {
      "type": "array",
      "description": "List of defined filters in the given model (as parameter).",
      "items": {
        "type": "object",
        "properties": {
          "Filter name": {
            "type": "string",
            "description": "Human-readable name of the filter."
          },
          "Filter ID": {
            "type": "integer",
            "description": "Unique identifier of the filter."
          },
          "Privacy mode": {
            "enum": [
              "Default Public",
              "Public",
              "Private"
            ],
            "description": "Visibility and access level of the filter."
          },
          "Filter description": {
            "type": "string",
            "description": "Optional free-text description explaining the purpose and intended use of the filter."
          },
          "Filter rules": {
            "type": "string",
            "description": "Filter definition expressed in JSON format. The rules specify the exact criteria used to include or exclude data."
          }
        }
      }
    }
  }
}

The MCP tool script that returns list of filters in the given model ID:

let result = Query(#{
	"Dimensions": null,
	"Values": [
		#{
			"Name": "Filter name",
			"Expression": "Name"
		},
		#{
			"Name": "Filter ID",
			"Expression": "Id"
		},
		#{
			"Name": "Privacy mode",
			"Expression": "switch (PublishMode) { case \"Public\": return \"Public\"; case \"Private\": return \"Private\"; case \"ModelDefault\": return \"Default Public\"; }"
		},
		#{
			"Name": "Filter description",
			"Expression": "Description"
		},
		#{
			"Name": "Filter rules",
			"Expression": "Rules == null ? null : ToJson(Rules)"
		}
	],
	"Ordering": [
		#{
			"Name": "Filter ID",
			"Direction": "Ascending"
		}
	],
	"Root": `ModelById(${modelId}).Filters`,
	"ContextType": "generic"
}).Collect();

return #{
  "filters": result.Rows.{
	let row = _;
	#{
	  "Filter name": row[0],
	  "Filter ID": row[1],
	  "Privacy mode": row[2],
	  "Filter description": row[3],
	  "Filter rules": row[4]
	}
  }
};

Get QPR ProcessDesigner graph image

The project export file below contains a custom MCP tool that retrieves a QPR ProcessDesigner diagram as an image, based on the diagram ID. The tool returns the image as binary PNG data, which AI clients that support images can display and interpret.

Installation:

  1. Copy the JSON content below and save it to a file with the .json extension.
  2. Import the file as a new project.
  3. Move the MCP tool to the project where you want to use it, and then delete the imported project.
{
	"Projects": [
		{
			"Name": "Get QPR ProcessDesigner graph image",
			"Scripts": [
				{
					"Name": "Get ProcessDesigner graph image",
					"Description": "Returns MEA diagram/graph/process level PNG image for the object identified by 'diagramId' from the configured QPR MEA server.",
					"Configuration": {
						"InputSchema": {
							"$schema": "https://json-schema.org/draft/2020-12/schema",
							"title": "Get QPR ProcessDesigner diagram image",
							"type": "object",
							"additionalProperties": false,
							"properties": {
								"diagramId": {
									"type": "string",
									"description": "Diagram ID (e.g. PG.577025292.123456) identifying the object whose diagram to be returned."
								}
							}
						},
						"McpTool": {
							"mimeType": "image/png",
							"annotations": {
								"destructiveHint": false,
								"idempotentHint": false,
								"openWorldHint": true,
								"readOnlyHint": true
							}
						}
					},
					"Code": "Project.CreateMeaConnection().GetGraphImage(diagramId)",
					"Language": "Expression",
					"McpPrimitiveType": "Tool"
				}
			]
		}
	]
}