Dataverse Plugin MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
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 |
|---|---|
| list_environmentsA | List the authentication profiles (Dataverse environments) configured in the pac CLI. |
| select_environmentA | Set which authentication profile/Dataverse environment is active (index from list_environments). |
| create_plugin_projectA | Create a new C# Dataverse plug-in project (pac plugin init) under plugins/. Generates a .NET (net462) project with a sample Plugin1 class ready to edit. Does not register anything in Dataverse -- it only creates the code locally. name: must be a valid C# identifier (no hyphens/spaces) -- it becomes the project namespace. sign: defaults to True -- generates a .snk key and signs the assembly with a strong name (required by classic assembly registration). Use False (--skip-signing) only if the package bundles unsigned third-party dependent assemblies. |
| build_pluginC | Build the plug-in project with 'dotnet build' and return the build output. |
| open_registration_toolA | Open the Plugin Registration Tool (PRT) for the FIRST registration of a plug-in package. 'pac plugin push' only UPDATES a package that already exists in Dataverse (it needs the pluginId). The first-time registration of a new package still requires the PRT or the Visual Studio extension -- there is no CLI command to create the package from scratch. After registering it for the first time in the PRT, copy the package/assembly GUID shown there and use it in push_plugin_update() for every following update. |
| push_plugin_updateA | Rebuild and push (upload) a plug-in that is ALREADY REGISTERED in Dataverse. plugin_id: GUID of the PluginPackage (or PluginAssembly), obtained from the first registration via the PRT. environment: index, name, or URL from list_environments(); empty uses the pac active environment. item_type: 'Nuget' (package generated by pac plugin init, plugin_id = PluginPackage) or 'Assembly' (loose dll, plugin_id = PluginAssembly -- requires file_path pointing to the compiled .dll, e.g. bin/Debug/net462/ProjectName.dll). file_path: relative to project_path; required when item_type='Assembly'. WARNING: this replaces the code currently running in the given environment. |
| list_registered_pluginsB | List the plug-in packages (pluginpackages) and assemblies (pluginassemblies) registered in the environment. |
| list_plugin_typesA | List the plug-in classes (plugintypes) of an assembly, given the assembly's name or GUID. |
| list_stepsB | List the SDK message processing steps (message/entity/stage) of a plug-in class. |
| create_stepA | Register a new SDK message processing step, binding a plug-in class to a message/entity/stage. plugin_type_name_or_id: typename (Namespace.Class), friendlyname, or GUID of the plugintype -- use list_plugin_types() to find it. message: Dataverse message name, e.g. 'Create', 'Update', 'Delete'. entity: logical name of the table (e.g. 'account'); empty = all entities that support the message. stage: 'PreValidation', 'PreOperation', or 'PostOperation'. filtering_attributes: comma-separated list of columns (only meaningful for 'Update'). rank: execution order among steps in the same stage/message/entity (lower runs first). configuration: free text (unsecure configuration) passed to the plugin's constructor. impersonate_user_id: GUID of a systemuser to run the step as ("Run in User's Context"); empty = runs as the user who triggered the operation. WARNING: this creates a real record in the environment -- the plug-in starts executing for real. |
| update_stepA | Update properties of an existing SDK message processing step. Each optional parameter is only changed if provided (None/empty = keep the current value), except filtering_attributes and configuration: pass an explicit empty string to clear the field. |
| delete_stepA | Delete an SDK message processing step (its images are removed in cascade). WARNING: the plug-in stops executing for this message/entity/stage combination. |
| set_secure_configurationA | Set the Secure Configuration of a step (text only accessible to the plug-in, not shown in the PRT/UI). Creates the secure configuration record if the step doesn't have one yet, or updates the existing one. |
| toggle_stepB | Enable or disable an existing SDK message processing step. |
| create_step_imageA | Register a pre/post image on an existing step, so the plug-in can read values before/after the operation. step_id: GUID of the step (returned by create_step or list_steps). attributes: comma-separated list of columns to include (e.g. 'description,firstname'); empty = all columns. image_type: 'PreImage' (values before the operation), 'PostImage' (after), or 'Both'. Pre-Image is not available for the 'Create' message (the row does not exist yet); Post-Image is not available for 'Delete'. alias: name used in the C# code to access the image (e.g. localPluginContext.PluginExecutionContext.PreEntityImages["PreImage"]). Empty uses 'image_type' itself as the alias. |
| list_imagesC | List the pre/post images registered on an SDK message processing step. |
| update_imageA | "Update" the attributes, alias, or type of an already-registered pre/post image. The Dataverse Web API rejects direct PATCH on sdkmessageprocessingstepimages (it always returns the generic, undocumented 0x80040216 error -- confirmed by testing; it looks like an undocumented platform limitation for this table). So this tool recreates the image instead: it reads the current values, deletes it, and creates a new one with the merged fields, bound to the same step. The image 'id' changes -- use the value returned by this call. Leave a parameter out (None) to keep its current value. |
| delete_imageB | Delete a pre/post image from a step, without deleting the step itself. |
| delete_assemblyA | Delete a registered PluginAssembly (without a PluginPackage). Only works if no SDK message processing steps depend on classes from this assembly -- delete the steps first with delete_step(). Dataverse rejects the deletion otherwise. |
| delete_packageA | Delete a registered PluginPackage (Nuget package). WARNING: this also deletes every assembly, plug-in class, and step inside the package. |
| list_available_messagesA | List the Dataverse message names (Create, Update, Delete, Assign, ...) supported by a table. Useful to know what to pass as 'message' to create_step() before attempting to register it. |
| list_execution_logsA | Read the latest Plug-in Trace Log entries (Trace()/exception logs from the plug-in). plugin_type_name: filters by typename (e.g. 'MyFirstPlugin.Plugin1'); empty = all plug-ins. Requires tracing to be enabled in the environment -- see configure_tracing(). |
| configure_tracingA | Turn the environment's Plug-in Trace Log on/off (required for list_execution_logs to work). level: 'Off', 'Exception' (only logs when the plug-in throws an exception), or 'All' (always logs). Remember to switch back to 'Off' or 'Exception' after debugging -- logs consume the organization's storage space. |
| xray_assemblyA | Generate a complete report of a registered plug-in assembly, in a single call: assembly metadata, every class (plugintype), every step with ALL its configuration (message, entity, stage, mode, rank, filtering attributes, whether it has a configuration/secure configuration, impersonation user), and each step's images. include_logs: appends, per class, the last 5 Plug-in Trace Log entries (duration and error, if any). Only returns something if tracing is enabled -- see configure_tracing(). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/lucasjesus0311/dataverse-plugin-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server