Skip to main content
Glama
Pangolin MCP Connector

Pangolin MCP Connector

by si-essence

pangolin_resources

DestructiveIdempotent

Manage self-hosted Pangolin resources: create, update, delete, and list resources, site resources, users, roles, whitelists, targets, rules, tokens, mTLS certificates, and AI provider attachments.

Instructions

pangolin_resources covers the resources toolset (123 operations). Auth header Authorization Bearer. Self-hosted Pangolin CE only. Writes need confirm:true and PANGOLIN_ALLOW_WRITES=true. Omit confirm for a dry-run preview. Actions: add_client_site_resources: POST /client/{clientId}/site-resources. Add a machine client to multiple site resources at once. add_private_resource_clients: POST /private-resource/{resourceId}/clients/add. Add a single client to a site resource. Clients with a userId cannot be added. add_private_resource_roles: POST /private-resource/{resourceId}/roles/add. Add a single role to a site resource. add_private_resource_users: POST /private-resource/{resourceId}/users/add. Add a single user to a site resource. add_public_resource_roles: POST /public-resource/{resourceId}/roles/add. Add a single role to a resource. When the resource has an inline policy defined (no shared resource policy assigned), the role is added to the inline policy instead of directly to the resource. add_public_resource_users: POST /public-resource/{resourceId}/users/add. Add a single user to a resource. When the resource has an inline policy defined (no shared resource policy assigned), the user is added to the inline policy instead of directly to the resource. add_public_resource_whitelist: POST /public-resource/{resourceId}/whitelist/add. Add a single email to the resource whitelist. add_resource_ai_models: POST /resource/{resourceId}/ai-models/add. Add a single model to an inference resource allow/block selection. Requires at least one attached AI provider in select mode. The model must belong to a select-mode provider and its listType must match the provider catalog entry. listType defaults to allow. add_resource_ai_providers: POST /resource/{resourceId}/ai-providers/add. Add or replace a single AI provider attachment on an inference resource. The provider is attached in inherit mode, using its own allow/block lists. add_resource_roles: POST /resource/{resourceId}/roles/add. Add a single role to a resource. When the resource has an inline policy defined (no shared resource policy assigned), the role is added to the inline policy instead of directly to the resource. add_resource_users: POST /resource/{resourceId}/users/add. Add a single user to a resource. When the resource has an inline policy defined (no shared resource policy assigned), the user is added to the inline policy instead of directly to the resource. add_resource_whitelist: POST /resource/{resourceId}/whitelist/add. Add a single email to the resource whitelist. add_site_resource_ai_models: POST /site-resource/{siteResourceId}/ai-models/add. Add a single model to an inference site resource allow/block selection. Requires at least one attached AI provider in select mode. The model must belong to a select-mode provider and its listType must match the provider catalog entry. listType defaults to allow. add_site_resource_ai_providers: POST /site-resource/{siteResourceId}/ai-providers/add. Add or replace a single AI provider attachment on an inference site resource. The provider is attached in inherit mode, using its own allow/block lists. add_site_resource_clients: POST /site-resource/{siteResourceId}/clients/add. Add a single client to a site resource. Clients with a userId cannot be added. add_site_resource_roles: POST /site-resource/{siteResourceId}/roles/add. Add a single role to a site resource. add_site_resource_users: POST /site-resource/{siteResourceId}/users/add. Add a single user to a site resource. create_org_private_resource: PUT /org/{orgId}/private-resource. Create a new site resource. create_org_public_resource: PUT /org/{orgId}/public-resource. Create a resource. create_org_resource: PUT /org/{orgId}/resource. Create a resource. create_org_site_resource: PUT /org/{orgId}/site-resource. Create a new site resource. create_public_resource_access_token: POST /public-resource/{resourceId}/access-token. Generate a new access token for a resource. create_public_resource_mtls_certificate: PUT /public-resource/{resourceId}/mtls/certificate. Add a trusted CA certificate that clients must present a certificate signed by when mTLS is enabled on a resource. Accepts a PEM bundle; each certificate in the bundle is stored separately. When no shared resource policy is assigned, this updates the resource's inline policy. create_public_resource_rule: PUT /public-resource/{resourceId}/rule. Create a resource rule. create_public_resource_target: PUT /public-resource/{resourceId}/target. Create a target for a resource. create_resource_access_token: POST /resource/{resourceId}/access-token. Generate a new access token for a resource. create_resource_mtls_certificate: PUT /resource/{resourceId}/mtls/certificate. Add a trusted CA certificate that clients must present a certificate signed by when mTLS is enabled on a resource. Accepts a PEM bundle; each certificate in the bundle is stored separately. When no shared resource policy is assigned, this updates the resource's inline policy. create_resource_rule: PUT /resource/{resourceId}/rule. Create a resource rule. create_resource_target: PUT /resource/{resourceId}/target. Create a target for a resource. delete_private_resource: DELETE /private-resource/{siteResourceId}. Delete a site resource. delete_public_resource: DELETE /public-resource/{resourceId}. Delete a resource. delete_public_resource_mtls_certificate: DELETE /public-resource/{resourceId}/mtls/certificate/{mtlsCertificateId}. Remove a trusted CA certificate from a resource. If it is the last one, mTLS is disabled on the resource since it can no longer verify any client. When no shared resource policy is assigned, this updates the resource's inline policy. delete_public_resource_rule: DELETE /public-resource/{resourceId}/rule/{ruleId}. Delete a resource rule. delete_resource: DELETE /resource/{resourceId}. Delete a resource. delete_resource_mtls_certificate: DELETE /resource/{resourceId}/mtls/certificate/{mtlsCertificateId}. Remove a trusted CA certificate from a resource. If it is the last one, mTLS is disabled on the resource since it can no longer verify any client. When no shared resource policy is assigned, this updates the resource's inline policy. delete_resource_rule: DELETE /resource/{resourceId}/rule/{ruleId}. Delete a resource rule. delete_site_resource: DELETE /site-resource/{siteResourceId}. Delete a site resource. get_org_resource: GET /org/{orgId}/resource/{niceId}. Get a resource by orgId and niceId. NiceId is a readable ID for the resource and unique on a per org basis. get_org_site_resource_nice: GET /org/{orgId}/site/{siteId}/resource/nice/{niceId}. Get a specific site resource by niceId. get_private_resource: GET /private-resource/{siteResourceId}. Get a specific site resource by siteResourceId. get_public_resource: GET /public-resource/{resourceId}. Get a resource by resourceId. get_public_resource_policies: GET /public-resource/{resourceId}/policies. Get the inline and shared policies associated with a resource. get_public_resource_whitelist: GET /public-resource/{resourceId}/whitelist. Get the whitelist of emails for a specific resource. get_resource: GET /resource/{resourceId}. Get a resource by resourceId. get_resource_blueprint: GET /resource/{resourceId}/blueprint. Generate a blueprint YAML snippet that recreates this resource. get_resource_policies: GET /resource/{resourceId}/policies. Get the inline and shared policies associated with a resource. get_resource_whitelist: GET /resource/{resourceId}/whitelist. Get the whitelist of emails for a specific resource. get_site_resource: GET /site-resource/{siteResourceId}. Get a specific site resource by siteResourceId. get_site_resource_blueprint: GET /site-resource/{siteResourceId}/blueprint. Generate a blueprint YAML snippet that recreates this site resource. list_org_private_resources: GET /org/{orgId}/private-resources. List all site resources for an organization. list_org_public_resource_names: GET /org/{orgId}/public-resource-names. List all resource names for an organization. list_org_public_resources: GET /org/{orgId}/public-resources. List resources for an organization. list_org_resources: GET /org/{orgId}/resources. List resources for an organization. list_org_resources_names: GET /org/{orgId}/resources-names. List all resource names for an organization. list_org_site_private_resources: GET /org/{orgId}/site/{siteId}/private-resources. List site resources for a site. list_org_site_resources: GET /org/{orgId}/site/{siteId}/resources. List site resources for a site. list_org_site_resources_org_id: GET /org/{orgId}/site-resources. List all site resources for an organization. list_private_resource_clients: GET /private-resource/{resourceId}/clients. List all clients for a site resource. list_private_resource_roles: GET /private-resource/{resourceId}/roles. List all roles for a site resource. list_private_resource_users: GET /private-resource/{resourceId}/users. List all users for a site resource. list_public_resource_access_tokens: GET /public-resource/{resourceId}/access-tokens. List all access tokens for a resource. list_public_resource_mtls_certificates: GET /public-resource/{resourceId}/mtls/certificates. List the trusted CA certificates for a resource's mTLS. When no shared resource policy is assigned, these are the resource's inline policy certificates. list_public_resource_roles: GET /public-resource/{resourceId}/roles. List all roles for a resource. list_public_resource_rules: GET /public-resource/{resourceId}/rules. List rules for a resource. list_public_resource_targets: GET /public-resource/{resourceId}/targets. List targets for a resource. list_public_resource_users: GET /public-resource/{resourceId}/users. List all users for a resource. list_resource_access_tokens: GET /resource/{resourceId}/access-tokens. List all access tokens for a resource. list_resource_ai_models: GET /resource/{resourceId}/ai-models. List the models this resource has selected from its select-mode providers' allow/block lists. Providers in inherit mode are not represented here; they use their own lists. list_resource_ai_providers: GET /resource/{resourceId}/ai-providers. List AI providers attached to an inference resource, including each attachment's accessMode. list_resource_mtls_certificates: GET /resource/{resourceId}/mtls/certificates. List the trusted CA certificates for a resource's mTLS. When no shared resource policy is assigned, these are the resource's inline policy certificates. list_resource_roles: GET /resource/{resourceId}/roles. List all roles for a resource. list_resource_rules: GET /resource/{resourceId}/rules. List rules for a resource. list_resource_targets: GET /resource/{resourceId}/targets. List targets for a resource. list_resource_users: GET /resource/{resourceId}/users. List all users for a resource. list_site_resource_ai_models: GET /site-resource/{siteResourceId}/ai-models. List the models this site resource has selected from its select-mode providers' allow/block lists. Providers in inherit mode are not represented here; they use their own lists. list_site_resource_ai_providers: GET /site-resource/{siteResourceId}/ai-providers. List AI providers attached to an inference site resource, including each attachment's accessMode. list_site_resource_clients: GET /site-resource/{siteResourceId}/clients. List all clients for a site resource. list_site_resource_roles: GET /site-resource/{siteResourceId}/roles. List all roles for a site resource. list_site_resource_users: GET /site-resource/{siteResourceId}/users. List all users for a site resource. remove_private_resource_clients: POST /private-resource/{resourceId}/clients/remove. Remove a single client from a site resource. Clients with a userId cannot be removed. remove_private_resource_roles: POST /private-resource/{resourceId}/roles/remove. Remove a single role from a site resource. remove_private_resource_users: POST /private-resource/{resourceId}/users/remove. Remove a single user from a site resource. remove_public_resource_roles: POST /public-resource/{resourceId}/roles/remove. Remove a single role from a resource. remove_public_resource_users: POST /public-resource/{resourceId}/users/remove. Remove a single user from a resource. remove_public_resource_whitelist: POST /public-resource/{resourceId}/whitelist/remove. Remove a single email from the resource whitelist. remove_resource_ai_models: POST /resource/{resourceId}/ai-models/remove. Remove a single model from an inference resource allow/block list. Requires at least one attached AI provider. remove_resource_ai_providers: POST /resource/{resourceId}/ai-providers/remove. Remove an AI provider attachment from an inference resource. At least one provider must remain. remove_resource_roles: POST /resource/{resourceId}/roles/remove. Remove a single role from a resource. remove_resource_users: POST /resource/{resourceId}/users/remove. Remove a single user from a resource. remove_resource_whitelist: POST /resource/{resourceId}/whitelist/remove. Remove a single email from the resource whitelist. remove_site_resource_ai_models: POST /site-resource/{siteResourceId}/ai-models/remove. Remove a single model from an inference site resource allow/block list. Requires at least one attached AI provider. remove_site_resource_ai_providers: POST /site-resource/{siteResourceId}/ai-providers/remove. Remove an AI provider attachment from an inference site resource. At least one provider must remain. remove_site_resource_clients: POST /site-resource/{siteResourceId}/clients/remove. Remove a single client from a site resource. Clients with a userId cannot be removed. remove_site_resource_roles: POST /site-resource/{siteResourceId}/roles/remove. Remove a single role from a site resource. remove_site_resource_users: POST /site-resource/{siteResourceId}/users/remove. Remove a single user from a site resource. set_public_resource_header_auth: POST /public-resource/{resourceId}/header-auth. Set or update the header authentication for a resource. If user and password is not provided, it will remove the header authentication. set_public_resource_password: POST /public-resource/{resourceId}/password. Set the password for a resource. Setting the password to null will remove it. set_public_resource_pincode: POST /public-resource/{resourceId}/pincode. Set the PIN code for a resource. Setting the PIN code to null will remove it. set_resource_header_auth: POST /resource/{resourceId}/header-auth. Set or update the header authentication for a resource. If user and password is not provided, it will remove the header authentication. set_resource_password: POST /resource/{resourceId}/password. Set the password for a resource. Setting the password to null will remove it. set_resource_pincode: POST /resource/{resourceId}/pincode. Set the PIN code for a resource. Setting the PIN code to null will remove it. update_private_resource: POST /private-resource/{siteResourceId}. Update a site resource. update_private_resource_clients: POST /private-resource/{resourceId}/clients. Set clients for a site resource. This will replace all existing clients. Clients with a userId cannot be added. update_private_resource_roles: POST /private-resource/{resourceId}/roles. Set roles for a site resource. This will replace all existing roles. update_private_resource_users: POST /private-resource/{resourceId}/users. Set users for a site resource. This will replace all existing users. update_public_resource: POST /public-resource/{resourceId}. Update a resource. Policy fields (sso, mfa, pincode, password, whitelist) update the inline policy when no shared resource policy is assigned; when a shared policy is assigned those fields override the shared policy for this resource only. update_public_resource_roles: POST /public-resource/{resourceId}/roles. Set roles for a resource. This will replace all existing roles. When the resource has an inline policy defined (no shared resource policy assigned), roles are set on the inline policy instead of directly on the resource. update_public_resource_rule: POST /public-resource/{resourceId}/rule/{ruleId}. Update a resource rule. update_public_resource_users: POST /public-resource/{resourceId}/users. Set users for a resource. This will replace all existing users. When the resource has an inline policy defined (no shared resource policy assigned), users are set on the inline policy instead of directly on the resource. update_public_resource_whitelist: POST /public-resource/{resourceId}/whitelist. Set email whitelist for a resource. This will replace all existing emails. update_resource: POST /resource/{resourceId}. Update a resource. Policy fields (sso, mfa, pincode, password, whitelist) update the inline policy when no shared resource policy is assigned; when a shared policy is assigned those fields override the shared policy for this resource only. update_resource_ai_models: POST /resource/{resourceId}/ai-models. Replace the allow/block model selection for an inference resource. Requires at least one attached AI provider in select mode. Models must belong to a select-mode provider and their listType must match the provider catalog entry. An empty array clears the selection, which denies all models for select-mode providers. update_resource_ai_providers: POST /resource/{resourceId}/ai-providers. Replace the AI providers attached to an inference resource. Each provider uses accessMode inherit (default, uses the provider's own allow/block lists) or select (uses the resource's selected subset of that provider's catalog). An empty list clears all providers. Effective allow model keys must be unique across attached providers. update_resource_roles: POST /resource/{resourceId}/roles. Set roles for a resource. This will replace all existing roles. When the resource has an inline policy defined (no shared resource policy assigned), roles are set on the inline policy instead of directly on the resource. update_resource_rule: POST /resource/{resourceId}/rule/{ruleId}. Update a resource rule. update_resource_users: POST /resource/{resourceId}/users. Set users for a resource. This will replace all existing users. When the resource has an inline policy defined (no shared resource policy assigned), users are set on the inline policy instead of directly on the resource. update_resource_whitelist: POST /resource/{resourceId}/whitelist. Set email whitelist for a resource. This will replace all existing emails. update_site_resource: POST /site-resource/{siteResourceId}. Update a site resource. update_site_resource_ai_models: POST /site-resource/{siteResourceId}/ai-models. Replace the allow/block model selection for an inference site resource. Requires at least one attached AI provider in select mode. Models must belong to a select-mode provider and their listType must match the provider catalog entry. An empty array clears the selection, which denies all models for select-mode providers. update_site_resource_ai_providers: POST /site-resource/{siteResourceId}/ai-providers. Replace the AI providers attached to an inference site resource. Each provider uses accessMode inherit (default, uses the provider's own allow/block lists) or select (uses the site resource's selected subset of that provider's catalog). An empty list clears all providers. Effective allow model keys must be unique across attached providers. update_site_resource_clients: POST /site-resource/{siteResourceId}/clients. Set clients for a site resource. This will replace all existing clients. Clients with a userId cannot be added. update_site_resource_roles: POST /site-resource/{siteResourceId}/roles. Set roles for a site resource. This will replace all existing roles. update_site_resource_users: POST /site-resource/{siteResourceId}/users. Set users for a site resource. This will replace all existing users.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "action": "<action>"
    },
    "name": "pangolin_resources"
  }
}

Input Schema

NameRequiredDescriptionDefault
bodyNoJSON body for the Pangolin operation. Secrets are redacted in output.
queryNoOpenAPI query parameters.
actionYesPangolin operation to call.
paramsNoOpenAPI path parameters, such as orgId or siteId.
confirmNoSet to the boolean true to execute the write. Omit this field for a dry-run preview. false and the string true are rejected.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the supplied annotations, the description discloses destructive semantics the annotations only flag generically: 'This will replace all existing clients/roles/users', null password/pincode removing the secret, removing the last mTLS certificate disabling mTLS, and empty AI model arrays denying all select-mode models. It also explains the non-obvious inline-policy vs shared-policy write target and the write-gate/dry-run mechanics, which are exactly the behaviors an agent cannot infer from readOnlyHint/destructiveHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Global rules are correctly front-loaded and each action entry is a terse verb+path+sentence, which is defensible for 123 operations. But it is extremely long and repetitive: the inline-policy caveat is restated six times, the 'Clients with a userId cannot be added' clause five times, and the mTLS 'last one disables mTLS' caveat four times, all of which could be hoisted into a shared preamble.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 123 operations, multiple resources types (org/public/private/site), and no output schema, the per-action summaries cover intent and most constraints adequately. What is missing is material for a write-heavy tool: no body field documentation, no return-shape or error hints, and no guidance on pagination for the many list_* actions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description does add value by mapping each action to its concrete path parameters (orgId, siteId, resourceId, siteResourceId, clientId, niceId), which the generic 'params' schema does not. However, the free-form 'body' object is entirely undocumented per action — no field names, types, or which fields each write expects — leaving the most error-prone input opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names the resource domain and scope ('resources toolset (123 operations)'), and every action is enumerated with an HTTP verb, path, and one-line purpose, so an agent can identify which resource surface this covers. It never explicitly states its boundary against pangolin_sites/pangolin_orgs, so the sibling differentiation is only implied by the name and paths (e.g. create_org_resource lives here rather than in pangolin_orgs).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Global usage rules are front-loaded and concrete: Authorization Bearer header, self-hosted CE only, writes require confirm:true plus PANGOLIN_ALLOW_WRITES=true, omit confirm for a dry-run. It gives per-action constraints (e.g. 'Clients with a userId cannot be added', 'Requires at least one attached AI provider in select mode'), but offers no routing guidance for choosing between overlapping siblings or between similar actions such as update_resource_users vs add_resource_users.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.